70 Spring MVC
SSM
Spring MVC 表现层框架(Struts2)
1.回顾MVC设计模式
MVC设计模式:(Model模型 View视图 Controller控制器)
Model1:
M:JavaBean(Service,Dao组成的这些类,操作后得到的数据结果)
V:JSP
C:JSP
Model2:
M:JavaBean
V:JSP
C:Servlet
Spring MVC就是Model2的一种体现。只不过对这种模式又做了优化,能够帮助我们简化表现层的开发。
2.掌握Spring MVC的环境搭建
导入Spring核心包和web,webmvc.
在web.xml中配置核心控制器DispatcherServlet
<!-- 配置核心控制器(调度员 等价于我们之前编写的BaseServlet) -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 通过初始化参数来指定核心配置文件位置 -->
<!-- 如果你不指定配置文件位置 它会自动寻找/WEB-INF/目录下的一个名为<servlet-name>-servlet.xml -->
<!-- /WEB-INF/springmvc-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!-- 跟随服务器启动进行实例化初始化 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
编写核心配置文件:-servlet.xml
<!-- SpringMVC默认处理规则:BeanNameUrlHandlerMapping 处理器映射器 -->
<!-- bean的name属性和url是对应的 -->
<!-- localhost:8080/day70/hello -->
<bean name="/hello" class="cn.kgc.demo1.HelloController"></bean>
<!-- 配置视图解析器 用来解析ModelAndView对象信息的 -->
<!-- /WEB-INF/index.jsp -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/"/>
<!-- 后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
编写自定义控制器
public class HelloController implements Controller {
// 处理请求
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("正在处理请求!");
// ModelAndView:Model对象(模型数据 在视图上展示的数据)和View对象(视图信息)
// ModelAndView(逻辑视图名)
ModelAndView modelAndView = new ModelAndView("index");
return modelAndView;
}
}
默认的处理器映射器是BeanNameUrlHandlerMapping,这个处理器映射器是根据bean的name名称来和url的地址进行映射的。
但是这样映射的后果是每一次有新的请求地址,都需要在xml中配置一个对应的bean,且对应的bean只能处理一个请求。
所以我们可以更换处理器映射器(推荐):注解驱动
在核心配置文件中开启注解驱动和IoC注解扫描
<context:component-scan base-package="cn.kgc.demo2">
</context:component-scan>
<!-- 开启注解驱动 更改处理器映射器为DefaultAnnotationHandlerMapping -->
<mvc:annotation-driven></mvc:annotation-driven>
编写自定义Controller
@Controller // IoC注解
public class HelloController{
@RequestMapping(value="/hello2")
public ModelAndView doHello2() {
System.out.println("正在处理请求2!");
// ModelAndView:Model对象(模型数据 在视图上展示的数据)和View对象(视图信息) // ModelAndView(逻辑视图名)
ModelAndView modelAndView = new ModelAndView("index");
return modelAndView;
}
@RequestMapping(value="/hello1")
public ModelAndView doHello1() {
System.out.println("正在处理请求1!");
// ModelAndView:Model对象(模型数据 在视图上展示的数据)和View对象(视图信息)
// ModelAndView(逻辑视图名)
ModelAndView modelAndView = new ModelAndView("index"); return modelAndView;
}
}
3.理解Spring mvc的执行流程[面试题题]
省略核心控制器加载过程。
当客户请求的时候,首先会被DispatcherServlet拦截,然后它会根据核心配置文件中的配置和对应开启的处理器映射器去查找对应的处理请求的方式(clazz.getDeclaredMethod(方法名,方法参数类型))
查找到指定方法之后,开始对请求过来的数据等信息进行封装和转换,然后再去调用找到的处理请求的方法,当处理请求的方法执行完毕后,可以得到一个视图和模型的对象。(Object result = method.invoke())
DispatcherServlet会去查找视图解析器来解析结果信息,然后将模型数据和视图信息进行封装绑定,然后返回给客户。
4.掌握控制器和视图的映射和数据传递
@RequestMapping注解:
它是用来请求映射的注解,不仅可以标注在方法上,也可以出现在类声明上,它必须保证全局唯一。
value:url映射路径
method:控制此方法能映射的请求方式的。RequesMethod[] 405 (Method Not Allwed)
params:控制此方法能映射的请求中的参数信息 如果请求时参数信息不满足会提示 400(Bad Request)
Headers:控制此方法能映射的请求中的请求头信息 如果请求时 请求头不满足 会提示错误。
表现层的作用:接收请求,并作出响应
V ->C:(View到Controller)
控制器想接收来自视图的数据,只需要在方法的参数中指明要接收的参数信息即可。
// localhost:8080/day70/login?uname=xx&pwd=xxx@RequestMapping(value="/login")public ModelAndView doLogin(String uname,String pwd) { System.out.println(uname+"-->"+pwd); return null;}
控制器接收到的数据可以按照你标注的类型自动进行转换。(时间类型需要特殊处理) BeanUtils
@RequestParams:用来标注请求参数的
name 指定请求参数名,一般我们请求参数名和方法参数名一致 可以省略
required 默认值为true 表示标注的参数必须存在 如果为false表示参数可以省略
defaultValue 设置请求参数的默认值
C ->V:(Controller到View)
通过ModelAndView返回类型来进行数据返回的。
@RequestMapping(value="/hello")
public ModelAndView doHello() {
// 指定逻辑视图名
ModelAndView modelAndView = new ModelAndView("index");
// modelAndView.setViewName(viewName);
// 指定存储的数据 默认是存储到了request作用域中
modelAndView.addObject("name", "haoran");
return modelAndView;
}
通过字符串返回逻辑视图名,通过参数中的Model/Map对象来返回数据
// 推荐
@RequestMapping(value="/hello")
public String doHello(Model model) {
// model.addAttribute("name", "zhaojingli");
// 如果不写键名 那么会默认以值类型的小写为键名
model.addAttribute("zhaojingli");
return "index";
}
/* @RequestMapping(value="/hello")
public String doHello(Map<String, Object> model) {
model.put("name", "chenxu");
return "index";
}
*/
5.SSM框架集合
MyBatis和Spring整合略
SpringMVC和Spring整合关键:将Spring配置文件也能够自动加载。
<!-- 可以自动加载Spring配置文件applicationContext.xml 默认自动去/WEB-INF/applicationContext.xml -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<!-- 此键名是Spring配置文件默认加载的入口 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 通过初始化参数来指定核心配置文件位置 -->
<!-- 如果你不指定配置文件位置 它会自动寻找/WEB-INF/目录下的一个名为<servlet-name>-servlet.xml -->
<!-- /WEB-INF/springmvc-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/*.xml</param-value>
</init-param>
<!-- 跟随服务器启动进行实例化初始化 -->
<load-on-startup>1</load-on-startup>
</servlet>