1 作 为 Spring 框 架 一 部 分 , 能 够 使 用 Spring 的 IoC 和 Aop 。 方 便 整 合
Strtus,MyBatis,Hiberate,JPA 等其他框架。
2 SpringMVC 强化注解的使用,在控制器,Service,Dao 都可以使用注解。方便灵活。
使用@Controller 创建处理器对象,@Service 创建业务对象,@Autowired 或者@Resource
在控制器类中注入 Service, Service 类中注入 Dao。
web.xml 中注册中央调度器
在<servlet/>中添加<load-on-startup/>的作用是,标记是否在 Web 服务器(这里是 Tomcat)
启动时会创建这个 Servlet 实例,即是否在 Web 服务器启动时调用执行该 Servlet 的 init()方
法,而不是在真正访问时才创建。
它的值必须是一个整数。
? 当值大于等于 0 时,表示容器在启动时就加载并初始化这个 servlet,数值越小,该 Servlet
的优先级就越高,其被创建的也就越早;
? 当值小于 0 或者没有指定时,则表示该 Servlet 在真正被使用时才会去创建。
? 当值相同时,容器会自己选择创建顺序。
该中央调度器为一个 Servlet,名称为 DispatcherServlet。中央调度器的全限定性类名在导入的 Jar 文件 spring-webmvc-4.3.9.RELEASE.jar 的第一个包 org.springframework.web.servlet
下可找到。
创建 SpringMVC 配置文件
<?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:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--声明方式1:未使用注解声明处理器对象,让他处理用户的某个请求 class:处理器类的全限定名称id:请求的uri地址,唯一值。 表示把这个请求交给处理器对象处理id的值必须以“/”开头--><!-- <bean id="/some.do" class="com.bjpowernode.controllers.MyController"/>--><!-- 声明方式2 使用注解声明组件扫描器,指定@Controller注解所在的包名 --><context:component-scan base-package="com.rdz.controller"/><!--声明视图解析器, 是springmvc中对象,处理视图(View)。视图解析器能组成视图的完整路径,并创建视图View对象--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 前缀:表示视图的目录位置 --><property name="prefix" value="/WEB-INF/view/"/><!-- 后缀:表示视图文件的扩展名 --><property name="suffix" value=".jsp"/></bean><!-- 声明静态资源的处理 location:静态资源在web应用中的目录,最好不要使用 /WEB-INF目录mapping:访问静态资源的uri地址, uri中可以使用通配符 ** ,**表示任意资源, 可以是目录,子目录,文件等资源。--><mvc:resources location="/html/" mapping="/html/**"/><mvc:resources location="/images/" mapping="/images/**"/><!-- 加入注解驱动标签 消除冲突 --><mvc:annotation-driven/></beans>
控制层代码:
1 未使用注解
package com.rdz.controller;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;/*** 处理器类:处理用户的请求。* * 处理器类也叫做后端控制器(back controller)** MyController 看做是 Servlet*/
public class MyController implements Controller {/*** handleRequest:叫做处理器方法,可以处理用户的请求。* 参数:* HttpServletRequest:请求对象* HttpServletResponse:应答对象* 返回值:ModelAndView(表示请求的处理结果)* Model:表示数据* View:表示视图(jsp,html)* * handleRequest看做是doGet()方法*/@Overridepublic ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception {//获取参数ModelAndView mav = new ModelAndView();//添加数据到Model//数据是存在request作用域的。 框架对象Model中的数据执行request.setAttribute("msg", "欢迎..")mav.addObject("sss","rdz");//使用视图的逻辑名称,逻辑名称就是文件名//当配置了视图解析器后: 可以前缀 + 逻辑名称 + 后缀 组成视图的完整路径///WEB-INF/view/other.jspmav.setViewName("other");//指定视图(jsp),视图完整路径,从web应用的根开始//mv是存放了数据和视图, 对数据和视图的处理在后续的代码中。return mav;}}
2 使用注解
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;/*** @Controller:创建处理器类对象,默认是单例对象* @Controller:表示处理器类,能处理请求。* 位置:方法的上面*/
@Controller
public class MyController {//自定义方法处理请求,方法类似于Servlet中的doGet, doPost/*** @RequestMapping:处理器映射,作用是把指定的请求交给方法处理* 属性:* 1.value :必须用的属性, 表示请求的uri地址, 地址必须是唯一的。* uri地址推荐使用“/”开头,是绝对地址。* * 位置:* 1.在方法的定义上面,常用的位置* 2.在类定义的上面* * 处理器方法:使用@RequestMapping标注的方法是处理器方法。能处理请求。*/@RequestMapping(value={"/some.do","/other.do"}) //url-patternpublic ModelAndView doSome(){System.out.println("执行处理器的doSome()");//调用Service处理请求,把结果放到ModelAndViewModelAndView mv = new ModelAndView();mv.addObject("msg", "SpringMVC Annotation");mv.addObject("fun", "doSome");mv.setViewName("show");return mv;}@RequestMapping(value={"/first.do","/second.do"}) //url-patternpublic ModelAndView doOther(){System.out.println("执行处理器的doOther()");//调用Service处理请求,把结果放到ModelAndViewModelAndView mv = new ModelAndView();mv.addObject("msg", "SpringMVC Annotation");mv.addObject("fun", "doOther");mv.setViewName("show");return mv;}
}ModelAndView 类中的 addObject()方法用于向其 Model 中添加数据。Model 的底层为一
个 HashMap。Model 中的数据存储在 request 作用域中,SringMVC 默认采用转发的方式跳转到视图,
本次请求结束,模型中的数据被销毁。若有多个请求路径均可匹配该处理器方法的执行,则@RequestMapping 的 value 属性中
可以写上一个数组。
附加@RequestParam详细控制层
/*** @Controller:创建处理器类对象,默认是单例对象* @Controller:表示处理器类,能处理请求。* 位置:方法的上面* * @RequestMapping: 请求映射* 属性:value ,请求地址的公共部分,相当于模块名称* 位置:类的上面*/
@Controller
@RequestMapping(value="/user")
public class MyController {//自定义方法处理请求,方法类似于Servlet中的doGet, doPost/*** 逐个接收请求参数:要求是处理器方法的形参名和请求中参数名一样* 使用RequestParam解决参数名称不一样的问题* @RequestParam* 属性: value 请求中参数名* required 是boolean类型的* true,默认值,表示请求中必须有此参数* false,可以没有参数* */@RequestMapping(value="/some.do") public ModelAndView doSome(@RequestParam(value="rname",required=false) String name,@RequestParam(value="rage",required=false) Integer age){System.out.println("执行处理器的doSome() name:"+name+"|age:"+age);//调用Service处理请求,把结果放到ModelAndViewModelAndView mv = new ModelAndView();mv.addObject("myname",name);mv.addObject("myage",age);mv.setViewName("show");return mv;}}