一、springMVC流程图省略
二、写一个简单的springmvc的demo来说明
2.1引入springMVC相关的jar包
2.2配置DispatcherServlet 在web.xml
<servlet> <!-- springmvc的配置文件必须在【servlet-name】-servlet.xml --> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- DispatcherServlet加载指定的springmvc的配置文件 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springMVC-annotation.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
2.3配置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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 配置一个handlerMapping 如果自己不配置handlerMapping 会默认有一个handlerMapping bean:表示对于什么什么的一个类 ctrl+shift+t:查找某个类的源码及路径 --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> <!-- 注册自己的controller类 --> <bean name="/my.do" class="com.zhiyou100.xz.controller.MyController1"></bean> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/view/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
2.4创建Controller类
public class MyController1 extends AbstractController{ @Override protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception { ModelAndView mv=new ModelAndView(); mv.setViewName("login");// /WEB-INF/view/login.jsp mv.addObject("username", "Hello World!");//功能类似于setAttribute 在request中 System.out.println("====mycontroller1===="); return mv; } }
三、springmvc的流程
- 客户发出请求。http://localhost:8080/springmvc-01/my.do
- 到达web.xml文件中 DispatcherServlet.查看是否符合url的要求
- DispatcherServlet就会查询springmvc的配置文件。找HandlerMapping. 根据bean的名称查找相对应的controller
- 找到我的MyController类。执行该类中的handleRequestInternal方法
- 根据返回的modelAndView在找springmvc配置文件中视图解析器
- 把viewName和prefix以及suffix做了一个拼接。把拼接的页面展示给客户
四、常见的HandlerMapping
4.1 BeanNameUrlHandlerMapping 根据bean标签的名称找到对应的Controller类
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 配置一个handlerMapping 如果自己不配置handlerMapping 会默认有一个handlerMapping bean:表示对于什么什么的一个类 ctrl+shift+t:查找某个类的源码及路径 --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> <!-- 注册自己的controller类 --> <bean name="/my.do" class="com.zhiyou100.xz.controller.MyController1"></bean> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/view/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
4.2 ControllerClassNameHandlerMapping 根据controller类的名字找到对应的Controller。
<!-- 根据controller类的名字查找对应的Controller类 浏览器的URL中:类中除了Controller首字母大写外,其他都小写,例如myController/mycontroller1 --> <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean> <!-- 注册自己的controller类 --> <bean class="com.zhiyou100.xz.controller.MyController1"> </bean>
4.3 SimpleUrlHandlerMapping 根据bean的id查找对应的Controller类。
<!-- 根据id查询相应的controller类 这里包含了id与url地址的映射关系 --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping "> <property name="mappings"> <props> <prop key="/a.do">my1</prop> <prop key="/b.do">my2</prop> </props> </property> </bean> <!-- 注册自己的controller类 --> <bean id="my1" class="com.zhiyou100.xz.controller.MyController1"></bean> <bean id="my2" class="com.zhiyou100.xz.controller.MyController2"></bean>
五、使用注解来替代配置信息
5.1 添加aop的jar包
5.2 创建Controller类
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller //等价于<bean class="com.zhiyou100.xz.controller.annotation.MyController1"> public class MyController1 { @RequestMapping("/list.do") //RequestMapping:表示的就是你的访问地址 public String list() { System.out.println("查询所有"); return "login"; } }
5.3 在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. 包扫描:扫描注解所在的包 component-scan:部件扫描--> <context:component-scan base-package="com.zhiyou100.xz.controller.annotation"/> <!-- 2.开启注解驱动AnnotationHandlerMapping --> <mvc:annotation-driven/> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/view/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
六、通过springmvc来完成接受的参数
import com.zhiyou100.xz.controller.bean.User; @Controller @RequestMapping("/user") public class MyController1 { @RequestMapping("/list.do") //RequestMapping:表示的就是你的访问地址 public String list(String name,int age) { //参数一定要和请求的参数名相同 System.out.println("name:"+name+";age:"+age); return "login"; } @RequestMapping("/list2.do") //RequestMapping:表示的就是你的访问地址 public String list(User user) { //参数一定要和请求的参数名相同 System.out.println(user); //请求的参数名要和实体类中的属性名相同 return "login"; } }
注意:
接受参数时出现乱码。使用过滤器。(自定义的过滤器 也可以使用springmvc提供的过滤器)
1.使用springmvc提供的过滤器,在spring-web-4.2.2.RELEASE.jar下的org.springframework.web.filter.CharacterEncodingFilter.class中
在web.xml中配置过滤器
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2.自定义的过滤器
先创建一个EncodingFilter.java
public class EncodingFilter implements Filter{ @Override public void destroy() {//过滤销毁时调用 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {//过滤功能 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); chain.doFilter(request, response); } @Override public void init(FilterConfig arg0) throws ServletException {//过滤初始化时调用 System.out.println("过滤初始化时调用"); } }
在web.xml中配置过滤器
<filter> <filter-name>EncodingFilter</filter-name> <filter-class>com.zhiyou100.filter.EncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>