1.什么是SpringMVC?
SpringMVC属于SpringFrameWork[Spring框架]的后续产品,已经如何在Spring Web Flow里面
Spring框架提供的web模块,包含了开发Web应用程序的全功能MVC模块
从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架。
集成其他WEB MVC开发框架,如Struts(现在一般不用),Struts2(一般老项目使用)等
SpringMVC是Spring框架提供的开发web应用程序的web层的MVC架构的子框架。
2.开发一个基于SpringMVC的程序
package com.springmvc.demo1;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 创建处理请求的控制器
*/
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//得到请求的参数值
String username=httpServletRequest.getParameter("username");
//创建ModelAndView对象
ModelAndView mav=new ModelAndView();
//封装数据
mav.addObject("myname",username);
//封装试图
mav.setViewName("test1.jsp");
return mav;
}
}
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>dispatcherServle</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServle</servlet-name>
<url-pattern>/</url-pattern>
<!-- 注意:<url-pattern>/</url-pattern> “/”后面没有* -->
</servlet-mapping>
</web-app>
<?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">
<!-- 配置URL解析器 -->
<!-- 解析http请求得到控制器类的访问路径-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- 配置控制器适配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- 配置控制器 -->
<!-- name:自定义控制器的访问路径 -->
<!-- class:自定义控制器的报名+类名 -->
<bean name="/hello" class="com.springmvc.demo1.HelloController"></bean>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=""></property>
</bean>
</beans>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>测试SpringMVC===${myname}</h1>
</body>
</html>
2.SpringMVC的执行流程
1.启动服务器的时候配置在web.xml文件中的中央控制器【DispatcherServlet】被初始化完成,并加载配置的springMVC的配置文件。
2.客户端浏览器发送http请求。
3.http请求被中央控制器【DispatcherServlet】拦截,转交给url解析器解析。
4.Url解析器解析http请求,得到具体的请求路径。
5.Url解析器将解析得到的具体的请求路径返回给中央控制器【DispatcherServlet】
6.中央控制器【DispatcherServlet】将得到的具体的请求路径转交给控制器适配器。
7.控制器适配器根据具体的请求路径在springmvc配置文件中查找与之对应的请求处理类【控制器类】
8.请求处理类【控制器类】就执行具体的请求处理,得到ModelAndView对象【1.数据。2.跳转地址】,将ModelAndView对象返回给中央控制器【DispatcherServlet】数据返回给客户端浏览器
9.中央控制器【DispatcherServlet】将ModelAndView对象转交给视图解析器去解析
10.视图解析器解析ModelAndView对象,得到一个具体的数据显示路径,将这个具体的数据显示路径返回给中央控制器【DispatcherServlet】
11.中央控制器【DispatcherServlet】得到的具体数据显示路径之后,将路径和所代表的资源转换形成一个html数据。
12.将转换执行后的html数据返回给客户端浏览器。
3.SpringMVC请求的访问路径配置
3.1web.xml文件中的DispatcherServlet配置的<url-pattern>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
配置控制器类的访问地址格式。
1.1<url-pattern>/</url-pattern>
与之对应的spring配置文件的控制器bean元素的name属性值 "/xxxxx"
springmvc.xml---控制器bean元素的name属性值 "/xxxx"
<bean name="/hello" class="com.xxxxx"></bean>
1.2<url-pattern>*.do / *.action / *.controller ....</url-pattern>
与之对应的spring配置文件的控制器bean元素的name属性值"/xxxx.do" /xxxx.action
springmvc.xml---控制器bean元素的name属性值“/xxxx.do /xxxx.action”
<bean name="/hello.action" class="com.xxxx"></bean
<url-pattern>/*</url-pattern> 这是一个错误的方式
3.2springmvc配置文件中的控制器的name属性值
控制器的name属性值设置要与web.xml文件中DispatcherServlet配置的<url-pattern>的配置形式一致
2.1web.xml文件中DispatcherServlet配置的<url-pattern>/</url-pattern>那么springmvc配置文件中的控制器的name属性值应该为“/xxxx”
2.2web.xml文件中DispatcherServlet配置的<url-pattern>*.do</url-pattern>那么springmvc配置文件中的控制器的name属性值应该为“/xxxx.do”
请求处理的控制器类
1.创建控制器类:指定保重新建java类,实现Controller接口 org.springframework.web.servlet.mvc.Controller;
2.重写handleRequest请求处理方法,注意返回值ModelAndView对象【没有就new】
3.在srpingmvc的配置文件中配置控制器类
<bean name="/控制器类的访问地址" class="控制器类的包名+类名"></bean>
请求处理方法handleRequest的返回值ModelAndView
ModelAndView是一个类,封装请求处理结果数据和试图路径,使用的时候没有就new
ModelAndView mav=new ModelAndView();
封装请求处理结果数据addObject(String,Object)
视图路径:setViewName("视图路径")【默认使用forword跳转[转发]】
setViewName("forward:视图路径");
setViewName("redirect:视图路径");----sendRedirect跳转[重定向]
视图解析器
springmvc配置文件中
利用请求处理类中的得到视图名,通过视图解析器的前缀和后缀合并到一个完整的访问路径
<!--配置视图解析器-->
<!--org.springframework.web.servlet.view.InternalResourceViewResolver-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property> 【前缀】
<property name="suffix" value=""></property> 【后缀】
</bean>
prefix-----[前缀]---"/"----项目访问路径
例如:项目的路径是demo1,在本机tomcat服务器上 http://127.0.0.1:8080/demo1/
suffix-----[后缀]---""
视图解析器结果=====prefix+setViewName("视图路径")+suffix
例如setViewName("test1.jsp")
prefix=/
suffix=""
http://127.0.0.1:8080/demo1/test1.jsp
setViewName("index")
prefix=/
suffix=".html"
http://127.0.0.1:8080/demo1/index.html
setViewName("index.jsp")
prefix=/
suffix=".html"
http://127.0.0.1:8080/demo1/index.jsp.html
DispatcherServlet中央处理器加载SpringMVC配置文件的设置
DispatcherServlet中央处理器在web.xml文件中配置<servlet>/<servlet-mapping>
SpringMVC配置文件在resources文件夹中
当服务器启动的时候会读取web.xml文件,我们需要在web.xml文件中红加载SpringMVC配置文件
1.当springMVC配置文件在resources目录下时
resources根目录
<!--配置加载springmvc的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
resources目录的子文件夹【spring】中
<!--配置加载springmvc的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
2.当springMVC在配置文件在WEB-INF目录下
springMVC配置文件
1.在WEB-INF目录下
2.在Spring配置文件的名称=中央控制器对应的servlet-name的元素的值-servlet.xml
web.xml文件中不需要配置<init-param>加载Spring配置文件
springMVC配置文件中WEB-INF目录下,名称不是中央控制器对应的servlet-name元素的值-servlet.xml
web.xml文件中需要配置<init-param>加载Springh配置文件
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/springmvc.xml</param-value>
</init-param>
SpringMVC的注解开发
在web.xml文件中配置中央控制器
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>dispatcherServle</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServle</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
在resources下创建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:mvc="http://www.springframework.org/schema/mvc"
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">
<!-- 开启注解 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 配置自动扫描包 -->
<context:component-scan base-package="com.springmvc.demo1"></context:component-scan>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=""></property>
</bean>
</beans>
创建控制类和请求处理方法
package com.springmvc.demo1;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
@Controller
public class HelloController {
@RequestMapping("/hello")
public ModelAndView helloReq(HttpServletRequest req){
String username=req.getParameter("username");
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("myname",username);
modelAndView.setViewName("test1.jsp");
return modelAndView;
}
}
创建test1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>测试基于注解的SpringMVC程序====${myname}</h1>
</body>
</html>