关于MVC请求流程:
spring mvc对MVC的请求流程处理:
由此可看出spring mvc中dispatcherservlet(前端控制器)起到了重要的作用,同时降低了各个模块之间的耦合。
环境配置:
jar包导入什么的就不多说了
在web.xml中配置前端控制器:
<!-- 配置前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定配置文件位置,默认在web-inf下找servlet名-servlet.xml,这里为springmvc-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
这里可以使用*.action
/ 表示拦截所有,但是这样静态的东西也会被拦截,比如jpg等等
/*在springmvc的底层是错误的拦截方式,会把我们返回到jsp页面的行为拦截
-->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<?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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<!-- 具体的handler -->
<bean id="UserControl" name="/user.action" class="com.control.UserControl"></bean>
<!-- (1)配置处理器映射器,都实现了HandlerMapping
此种映射器是通过handler的那么匹配的,即handler的name为一个url
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!--(2)简单url映射, 集中配置bean的id对应 的url -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/user1.action">UserControl</prop>
<prop key="/user2.action">UserControl</prop>
</props>
</property>
</bean>
<!-- 配置处理器适配器,都实现了HandlerAdapter
此种适配器要求,编写的handler需要实现Controller接口
-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- 另一种适配器
此种适配器要求,编写的handler需要实现 HttpRequestHandler接口
此种方式可以用来响应json字符串(同原生servlet)
-->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
<!-- 配置视图解析器
这里使用的是jsp的视图解析器,默认使用jstl
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
</beans>
这里使用了3个url来访问相同的handler,都可以访问,说明多个映射器可以共存(多个适配器可共存)
使用注解配置的springmvc.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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<!-- 开启组件扫描,加载handler(controller),完成bean的创建和依赖注入 -->
<context:component-scan base-package="com.lee.controller"></context:component-scan>
<!-- 注解处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<!-- 注解处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
<!-- 使用这种方式,代替了上面注解映射器和注解适配器
mvc:annotation-driven中默认加载了很多参数绑定方法,比如json的转换解析器等。。。
开发中常用
-->
<!-- <mvc:annotation-driven/> -->
<!-- 配置视图解析器
这里使用的是jsp的视图解析器,默认使用jstl
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
handler中代码:
package com.control;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import com.domain.User;
public class UserControl implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
User user1 = new User();
user1.setId(1);
user1.setName("hello");
user1.setPassword("world");
User user2 = new User();
user2.setId(2);
user2.setName("张三");
user2.setPassword("世界");
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
//返回modelandview
ModelAndView mav = new ModelAndView();
//相当于request中设置属性
mav.addObject("userlist", list);
//指定视图
mav.setViewName("/WEB-INF/jsp/user.jsp");
return mav;
}
}
使用注解后的handler
package com.lee.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.lee.domain.User;
import com.lee.service.impl.UserServiceImpl;
@Controller
public class UserController {
@Autowired
private UserServiceImpl userService;
public UserServiceImpl getUserService() {
return userService;
}
/**
* Description: 查找用户信息
* @author LiCheng
* @throws Exception
* @date 2017年8月24日
*/
@RequestMapping("/findUser")
public ModelAndView findUser() throws Exception{
//1.调用service查找用户
List<User> list = userService.findUserByState(1);
//2.创建modelandview
ModelAndView mav = new ModelAndView();
mav.addObject("userlist", list);
//3.指定视图
mav.setViewName("user");
return mav;
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border="1">
<c:forEach items="${userlist }" var="user">
<tr>
<td>${user.id }</td>
<td>${user.name }</td>
<td>${user.password }</td>
</tr>
</c:forEach>
</table>
</body>
</html>
关于springMVC的一些注解
@RequestMapping
1.设置url,方法上
2.窄化请求,类上
3.限制请求方式,可以设置多个,表示只能用限制的访问方式
如:@RequestMapping(value="/findUser",method={RequestMethod.GET,RequestMethod.POST})
这就表示只能通过get或者post提交请求
controller的返回值问题:
在上面的controller方法中,返回值为ModelAndView,把模型数据添到此对象,然后指定视图返回。
controller的返回值还可以是String类型,和void类型
String类型的返回值,指定视图,数据怎么办呢,需要在controller的方法中指定形参,Model model,这个springMVC默认支持的一种,通过Model对象的方法,设置我们需要传到前端的数据。在model对象的内部,和ModelAndView一样把里面的key/value数据依次复制给了request域。
如果返回值是String类型,就可以完成客户端register和服务器forward方式的跳转了。
分别为:return "register:XXX";
return "forward:XXX";
xxx为请求的url地址,如果跳转的url在本controller类中,只需要写子url即可。
如果返回值为void的话
操作方式和原生servlet差不多。
关于springMVC请求参数的问题:
springMVC的请求参数是通过controller方法的形参来获取的。
默认支持:HttpServletRequst,HttpServletResponse,HttpSession,Model/ModelMap
还支持简单类型:如int,string,float,dobule。。。。等等,需要注意的是,如果直接在controller方法中写简单类型的形参,形参的名字必须和url请求参数的key一致,如果不一致需要在形参前面配置@RequestParam(value="id")
这样就可以将url中请求参数的key同controller方法中的形参绑定起来。
pojo类的参数绑定,请求url参数如果很多,且都是一个pojo类中的属性,此时springMVC也提供了pojo类的参数绑定,需要遵守的是,前端url请求的参数的key名必须和pojo类中的属性名一致。
自定义参数绑定,有时候请求的url参数类型与后端使用类型不匹配,比如日期,这时候pojo类中那个属性的绑定会失败,可以通过在处理器适配器中添加自定义绑定规则来实现。