现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了。不过要想灵活运用Spring MVC来应对大多数的Web开发,就必须要掌握它的配置及原理。一、Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0)1. jar包引入Spring 2.5.6:spring.jar、spring-webmvc.jar、commons-logging.jar、cglib-nodep-2.1_3.jarHibernate 3.6.8:hibernate3.jar、hibernate-jpa-2.0-api-1.0.1.Final.jar、antlr-2.7.6.jar、commons-collections-3.1、dom4j-1.6.1.jar、javassist-3.12.0.GA.jar、jta-1.1.jar、slf4j-api-1.6.1.jar、slf4j-nop-1.6.4.jar、相应数据库的驱动jar包SpringMVC是一个基于DispatcherServlet的MVC框架,每一个请求最先访问的都是DispatcherServlet,DispatcherServlet负责转发每一个Request请求给相应的Handler,Handler处理以后再返回相应的视图(View)和模型(Model),返回的视图和模型都可以不指定,即可以只返回Model或只返回View或都不返回。DispatcherServlet是继承自HttpServlet的,既然SpringMVC是基于DispatcherServlet的,那么我们先来配置一下DispatcherServlet,好让它能够管理我们希望它管理的内容。HttpServlet是在web.xml文件中声明的。复制代码
<!-- Spring MVC配置 -->
<!-- ====================================== -->
<servlet><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 可以自定义servlet.xml配置文件的位置和名称,默认为WEB-INF目录下,名称为[<servlet-name>]-servlet.xml,如spring-servlet.xml<init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-servlet.xml</param-value>  默认</init-param>--><load-on-startup>1</load-on-startup>
</servlet><servlet-mapping><servlet-name>spring</servlet-name><url-pattern>*.do</url-pattern>
</servlet-mapping><!-- Spring配置 -->
<!-- ====================================== -->
<listener><listenerclass>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener><!-- 指定Spring Bean的配置文件所在目录。默认配置在WEB-INF目录下 -->
<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:config/applicationContext.xml</param-value>
</context-param>
复制代码spring-servlet.xml配置spring-servlet这个名字是因为上面web.xml中<servlet-name>标签配的值为spring(<servlet-name>spring</servlet-name>),再加上“-servlet”后缀而形成的spring-servlet.xml文件名,如果改为springMVC,对应的文件名则为springMVC-servlet.xml。复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"     xmlns:context="http://www.springframework.org/schema/context"     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd   http://www.springframework.org/schema/context <a href="http://www.springframework.org/schema/context/spring-context-3.0.xsd">http://www.springframework.org/schema/context/spring-context-3.0.xsd</a>"><!-- 启用spring mvc 注解 --><context:annotation-config /><!-- 设置使用注解的类所在的jar包 --><context:component-scan base-package="controller"></context:component-scan><!-- 完成请求和注解POJO的映射 --><bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /><!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/jsp/" p:suffix=".jsp" />
</beans>
复制代码DispatcherServlet会利用一些特殊的bean来处理Request请求和生成相应的视图返回。关于视图的返回,Controller只负责传回来一个值,然后到底返回的是什么视图,是由视图解析器控制的,在jsp中常用的视图解析器是InternalResourceViewResovler,它会要求一个前缀和一个后缀在上述视图解析器中,如果Controller返回的是blog/index,那么通过视图解析器解析之后的视图就是/jsp/blog/index.jsp。主要是说说Controller.一个类使用了@Controller进行标记的都是Controller复制代码
package controller;import javax.servlet.http.HttpServletRequest;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;import entity.User;@Controller  //类似Struts的Action
public class TestController {@RequestMapping("test/login.do")  // 请求url地址映射,类似Struts的action-mappingpublic String testLogin(@RequestParam(value="username")String username, String password, HttpServletRequest request) {// @RequestParam是指请求url地址映射中必须含有的参数(除非属性required=false)// @RequestParam可简写为:@RequestParam("username")if (!"admin".equals(username) || !"admin".equals(password)) {return "loginError"; // 跳转页面路径(默认为转发),该路径不需要包含spring-servlet配置文件中配置的前缀和后缀}return "loginSuccess";}@RequestMapping("/test/login2.do")public ModelAndView testLogin2(String username, String password, int age){// request和response不必非要出现在方法中,如果用不上的话可以去掉// 参数的名称是与页面控件的name相匹配,参数类型会自动被转换if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {return new ModelAndView("loginError"); // 手动实例化ModelAndView完成跳转页面(转发),效果等同于上面的方法返回字符串}return new ModelAndView(new RedirectView("../index.jsp"));  // 采用重定向方式跳转页面// 重定向还有一种简单写法// return new ModelAndView("redirect:../index.jsp");}@RequestMapping("/test/login3.do")public ModelAndView testLogin3(User user) {// 同样支持参数为表单对象,类似于Struts的ActionForm,User不需要任何配置,直接写即可String username = user.getUsername();String password = user.getPassword();int age = user.getAge();if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {return new ModelAndView("loginError");}return new ModelAndView("loginSuccess");}@Resource(name = "loginService")  // 获取applicationContext.xml中bean的id为loginService的,并注入private LoginService loginService;  //等价于spring传统注入方式写get和set方法,这样的好处是简洁工整,省去了不必要得代码@RequestMapping("/test/login4.do")public String testLogin4(User user) {if (loginService.login(user) == false) {return "loginError";}return "loginSuccess";}
}
复制代码以上4个方法示例,是一个Controller里含有不同的请求url,也可以采用一个url访问,通过url参数来区分访问不同的方法,代码如下:复制代码
package controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;@Controller
@RequestMapping("/test2/login.do")  // 指定唯一一个*.do请求关联到该Controller
public class TestController2 {@RequestMappingpublic String testLogin(String username, String password, int age) {// 如果不加任何参数,则在请求/test2/login.do时,便默认执行该方法if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {return "loginError";}return "loginSuccess";}@RequestMapping(params = "method=1", method=RequestMethod.POST)public String testLogin2(String username, String password) {// 依据params的参数method的值来区分不同的调用方法// 可以指定页面请求方式的类型,默认为get请求if (!"admin".equals(username) || !"admin".equals(password)) {return "loginError";}return "loginSuccess";}@RequestMapping(params = "method=2")public String testLogin3(String username, String password, int age) {if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {return "loginError";}return "loginSuccess";}
}
复制代码其实RequestMapping在Class上,可看做是父Request请求url,而RequestMapping在方法上的可看做是子Request请求url,父子请求url最终会拼起来与页面请求url进行匹配,因此RequestMapping也可以这么写:复制代码
package controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping("/test3/*")  // 父request请求url
public class TestController3 {@RequestMapping("login.do")  // 子request请求url,拼接后等价于/test3/login.dopublic String testLogin(String username, String password, int age) {if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {return "loginError";}return "loginSuccess";}
}
复制代码在SpringMVC中常用的注解还有@PathVariable,@RequestParam,@PathVariable标记在方法的参数上,利用它标记的参数可以利用请求路径传值,看下面一个例子@RequestMapping(value="/comment/{blogId}", method=RequestMethod.POST)
public void comment(Comment comment,@PathVariable int blogId, HttpSession session, HttpServletResponse response) throws IOException {}在该例子中,blogId是被@PathVariable标记为请求路径变量的,如果请求的是/blog/comment/1.do的时候就表示blogId的值为1. 同样@RequestParam也是用来给参数传值的,但是它是从头request的参数里面取值,相当于request.getParameter("参数名")方法。在Controller的方法中,如果需要WEB元素HttpServletRequest,HttpServletResponse和HttpSession,只需要在给方法一个对应的参数,那么在访问的时候SpringMVC就会自动给其传值,但是需要注意的是在传入Session的时候如果是第一次访问系统的时候就调用session会报错,因为这个时候session还没有生成。

  

转载于:https://www.cnblogs.com/mengyuxin/p/5226730.html

spring MVC配置详解相关推荐

  1. SpringMVC基础--spring MVC配置详解

    牧涛 --<-<-<@态度决定一切→_→... 博客园 首页 新闻 新随笔 联系 管理 订阅 随笔- 171  文章- 3  评论- 79  spring MVC配置详解 现在主流的 ...

  2. linux spring mvc tomcat配置,Spring MVC配置详解

    一.Spring MVC处理流程 1.Spring MVC将所有请求都交由DispatchServlet进行处理. 2.DispatchServlet获取HandlerMapping(处理映射器),然 ...

  3. Spring和Spring Mvc整合详解

    Spring和Spring Mvc整合详解 官方主页 Spring Spring Mvc SpringMvc 5,可以参考这一篇<Spring和Spring Mvc 5整合详解> 概述 S ...

  4. Spring MVC异常处理详解 ExceptionHandler good

    Spring MVC异常处理详解 ExceptionHandler good 参考文章: (1)Spring MVC异常处理详解 ExceptionHandler good (2)https://ww ...

  5. Spring MVC异常处理详解

    Spring MVC异常处理详解 参考文章: (1)Spring MVC异常处理详解 (2)https://www.cnblogs.com/xinzhao/p/4902295.html 备忘一下.

  6. Spring MVC 教程详解 个人总结 复习必备 面试宝典 狂神笔记

    文章目录 一.MVC 模式 1.什么是 MVC 2.Servlet MVC 小结 二.Spring MVC 1.Spring MVC 概念 为什么学习 Spring MVC 中央控制器 Dispatc ...

  7. spring mvc DispatcherServlet详解之前传---FrameworkServlet

    做项目时碰到Controller不能使用aop进行拦截,从网上搜索得知:使用spring mvc 启动了两个context:applicationContext 和WebapplicationCont ...

  8. spring mvc DispatcherServlet详解之二---request通过Controller获取ModelAndView过程

    整个spring mvc的架构如下图所示: 上篇文件讲解了DispatcherServlet通过request获取控制器Controller的过程,现在来讲解DispatcherServletDisp ...

  9. spring mvc DispatcherServlet详解之前传---前端控制器架构

    前端控制器是整个MVC框架中最为核心的一块,它主要用来拦截符合要求的外部请求,并把请求分发到不同的控制器去处理,根据控制器处理后的结果,生成相应的响应发送到客户端.前端控制器既可以使用Filter实现 ...

最新文章

  1. 田志刚:要你共享,但不告诉你共享什么
  2. android6.0 主题,Android 6.0 DatePickerDialog主题
  3. java文本库,自定义文本库
  4. Jsoup代码解读之一-概述
  5. 【MySQL】MySQL 8不支持查询缓存
  6. 信息服务器 iis 5.0,使用IIS 5.0调整Web服务器的艺术与科学(4)
  7. 【渝粤教育】国家开放大学2018年秋季 1117t机电控制与可编程序控制 参考试题
  8. php如何使用网关,在某种情况下,由于PHP代码,网关已关闭(Gateway is down because of PHP code in one situation)...
  9. Atitit office ooxml 系列 excel的读取api 框架 poi的使用
  10. systemd使用教程
  11. Flutter 静态挂载腾讯X5WebView(Tbs)浏览器内核
  12. C rgb565转rgb888
  13. 如何从git中移除一个子模块(submodule)
  14. Android:短信的接收
  15. C#通用类库整理--字符串处理类
  16. Python批量翻译英文成中文
  17. debian10安装docker
  18. Cocos2d-x 3D模型渲染
  19. Windows搜索文件技巧:Listary和Everything各有千秋(比较、对比)
  20. 创建ODOO12演示账套

热门文章

  1. mac下androidStudio 运行模拟器出现:
  2. 面试被问到“零拷贝”!你真的理解吗?
  3. 阿里淘宝一直在推的响应式编程到底是个什么鬼?
  4. 干货,springboot自定义注解实现分布式锁详解
  5. 理论+实践轻松掌握nohup java -jar xxxx.jar /dev/null 21 意义
  6. react如何通过shouldComponentUpdate来减少重复渲染
  7. Docker实战:Docker安装部署RabbitMQ
  8. 【Scratch】青少年蓝桥杯_每日一题_7.01_正五边形组成的美丽春花
  9. java xlsx读写_Java读写Excel
  10. mysql有两个结果集,MySQL:两个结果集的差异