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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://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()方法
*/
@Override
public 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.jsp
mav.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-pattern
public ModelAndView doSome(){
System.out.println("执行处理器的doSome()");
//调用Service处理请求,把结果放到ModelAndView
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "SpringMVC Annotation");
mv.addObject("fun", "doSome");
mv.setViewName("show");
return mv;
}
@RequestMapping(value={"/first.do","/second.do"}) //url-pattern
public ModelAndView doOther(){
System.out.println("执行处理器的doOther()");
//调用Service处理请求,把结果放到ModelAndView
ModelAndView 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处理请求,把结果放到ModelAndView
ModelAndView mv = new ModelAndView();
mv.addObject("myname",name);
mv.addObject("myage",age);
mv.setViewName("show");
return mv;
}
}