1 简介
Springmvc : 是Spring框架的一个模块,实现了Web的MVC请求。Spring3.0推出的。
Structs2(Filter) SpringMVC(Servlet)
Hibernate MyBatis
Mvc的工作流程
JavaWeb-----url-pattern-----Servlet(service)
springmvc---dispatcherservlet------通过HandlerMapping(找对应的处理器)-----处理器适配器(统一调度)-----处理器
mvc分为配置开发和注解开发
Handler处理器:
Controller
HttpRequestHandler
AbstractController
使用mvc需要导入的jar包
1 注解开发
下面两种方法最终底层都是实现的controller
web.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>Spring-mvc</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>spring_mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定spring mvc配置文件位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring_mvc</servlet-name>
<!--
官方建议使用 *.do (三阶段使用这个)
不能用/*
可以使用/,支持restful风格
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
controller
package com.woniu.comtroller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
//实现Controller
public class Mycontroller implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
ModelAndView ve=new ModelAndView();
ve.addObject("qwe", "123123qwe");
ve.setViewName("/a.jsp");
System.out.println(ve);
return ve;
}
}
第一种 配置方法
Spring mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<bean id="/mycontroller.do" class="com.woniu.comtroller.Mycontroller">
</bean>
</beans>
第二种 配置方法
HandlerMapping处理器映射器
Spring mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 如果有多个请求路径 ,掉用同一个处理器有两种方法
方法一:缺点:多个请求路径使用同一个处理器,配置一个comtroller的多个bean
<bean id="/mycontroller.do" class="com.woniu.comtroller.Mycontroller"/>
<bean id="/you.do" class="com.woniu.comtroller.Mycontroller"/>
方法二 不同路径调用同一个bean
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMappings">
<property name="urlMap">
<map>
<entry key="/mycontroller.do" value-ref="mycontroller"></entry>
<entry key="/you.do" value-ref="mycontroller"></entry>
</map>
</property>
</bean>
-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<entry key="/mycontroller.do" value-ref="mycontroller"></entry>
<entry key="/you.do" value-ref="mycontroller"></entry>
</map>
</property>
</bean>
<!-- 创建mycontroller对象 -->
<bean id="mycontroller" class="com.woniu.comtroller.Mycontroller"/>
<!-- 默认的处理器映射器 bean的id就代表请求路径 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
</beans>
2 HandlerAdapter(处理器适配器)
SpringMMV框架通过处理适配器调用处理器,底层使用的适配器模式,为不同接口提供一种统一的调用方式
处理器适配器不用自己配置,框架会根据处理器的类型自动选择对应的处理器适配器
1 实现了Controller接口的处理器都使用SimpleControllerHandlerAdapter调用
2 MultiActionController:支持在一个处理器执行多个处理方法(通过请求来访问不同的方法)
Mycontroller代码:
package com.woniu.comtroller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
public class Mycontroller2 extends MultiActionController{
public ModelAndView dofirst(HttpServletRequest req, HttpServletResponse res) throws Exception {
System.out.println("dofirst");
ModelAndView ve=new ModelAndView();
ve.addObject("qwe", "dofirst");
ve.setViewName("/a.jsp");
System.out.println(ve);
return ve;
}
public ModelAndView dosecond(HttpServletRequest req, HttpServletResponse res) throws Exception {
System.out.println("dosecond");
ModelAndView ve=new ModelAndView();
ve.addObject("qwe", "dosecond");
ve.setViewName("/a.jsp");
System.out.println(ve);
return ve;
}
public ModelAndView dothird(HttpServletRequest req, HttpServletResponse res) throws Exception {
System.out.println("dothird");
ModelAndView ve=new ModelAndView();
ve.addObject("qwe", "dothird");
ve.setViewName("/a.jsp");
System.out.println(ve);
return ve;
}
public ModelAndView dofourth(HttpServletRequest req, HttpServletResponse res) throws Exception {
System.out.println("dofourth");
ModelAndView ve=new ModelAndView();
ve.addObject("qwe", "dofourth");
ve.setViewName("/a.jsp");
System.out.println(ve);
return ve;
}
public ModelAndView dofifth(HttpServletRequest req, HttpServletResponse res) throws Exception {
System.out.println("dofifth");
ModelAndView ve=new ModelAndView();
ve.addObject("qwe", "dofifth");
ve.setViewName("/a.jsp");
System.out.println(ve);
return ve;
}
}
3 注解开发
web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>Spring-mvc-annotation</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>spring_mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定spring mvc配置文件位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>Spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring_mvc</servlet-name>
<!--
官方建议使用 *.do (三阶段使用这个)
不能用/*
可以使用/,支持restful风格
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 设置post请求的编码格式 通过过滤器 -->
<filter>
<filter-name>my_filter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>my_filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Spring-mvc.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 包扫描 -->
<context:component-scan base-package="com.woniu.conroller"/>
</beans>
mycontroller 代码:
package com.woniu.conroller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.woniu.entity.Users;
@Controller
@RequestMapping("/my")//命名空间
public class controller_annotation {
//多个路径使用同一个
@RequestMapping(value={"/dofirst.do","/dothred.do"})
public ModelAndView reqs(HttpServletRequest req,HttpServletResponse res,Users user) throws ServletException, IOException {
System.out.println("reqs"+user);
ModelAndView ve=new ModelAndView();
ve.addObject("ewq", "dofirst");
ve.setViewName("/a.jsp");
return ve;
}
@RequestMapping("/doscecond.do")
public ModelAndView doscecond(Users user) {
System.out.println("doscecond"+user);
ModelAndView ve=new ModelAndView();
ve.addObject("ewq", "doscecond");
ve.setViewName("/a.jsp");
return ve;
}
// *为任意层 *这一层必须得加不然请求不到 /*/doscecond1.do
@RequestMapping("/*/doscecond1.do")
public ModelAndView doscecond1(Users user) {
System.out.println("doscecond1"+user);
ModelAndView ve=new ModelAndView();
ve.addObject("ewq", "doscecond1");
ve.setViewName("/a.jsp");
return ve;
}
// my/**(任意层,可以没有)/doscecond2.do
@RequestMapping("/**/doscecond2.do")
public ModelAndView doscecond2(Users user) {
System.out.println("doscecond2"+user);
ModelAndView ve=new ModelAndView();
ve.addObject("ewq", "doscecond2");
ve.setViewName("/a.jsp");
return ve;
}
//所有已dot开头请求的都走这里
@RequestMapping("/doto*.do")
public ModelAndView dotongpei(Users user) {
System.out.println("dotongpei"+user);
ModelAndView ve=new ModelAndView();
ve.addObject("ewq", "dotongpei");
ve.setViewName("/a.jsp");
return ve;
}
//限定请求类型(这是选的是post 就只能处理post请求)
@RequestMapping(value="/doxianding.do",method=RequestMethod.POST )
public ModelAndView doxianding(Users user) {
System.out.println("doxianding"+user);
ModelAndView ve=new ModelAndView();
ve.addObject("ewq", "doxianding");
ve.setViewName("/a.jsp");
return ve;
}
}