SpringMVC 简介
SpringMVC是Spring框架的一部分,是在Spring3.0以后发布的。
SpringMVC的简单应用
用户提交一个请求,服务端处理器在接收到这个请求之后,给出一条欢迎信息。
SpringMVC框架的执行流程
配置web.xml
url-pattern只能配*.do , 不能配 /* , 因为 /* 会匹配所有请求,如果过来的是静态页面的请求,那么中央处理器把这个路径交给处理器,但是处理器找不到对应的东西所以这时会出现404错误
最好不要写为 / ,它也会拦截所有资源请求,但是,它只会处理动态资源请求
当添加图片的时候(链接js,css的时候),就会访问不到,因为图片的加载也是请求,而且图片属于静态请求,从而不会处理,所以导致加载不出来
Resultful 风格形式的请求路径方法,必须使用/ , 而不是*.do之类的。这就会出现上面所述的问题,下面是解决办法。
解决配成 / 后可以请求处理静态请求的方案:
方案一:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
这样就会处理*.jpg的请求(把所有静态资源请求的路径都列出来)
default所对应的servlet类在tomcat中的conf的web.xml中已经配置其作用是专门匹配没有处理的静态资源的
方案二:
在springmvc-servlet.xml中配置<mvc:default-servlet-handler/>就可以了<mvc:default-servlet-handler/>会将对静态资源的访问的请求通过HandlerMapping映射到默认Servlet请求处理器DefaultServletHttpRequestHandler对象。而该处理器调用了DefaultServlet来处理静态资源的访问请求
当然想要使用<mvc:.../>标签,需要mvc约束
<?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_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>SpringMVCDemoA</display-name>
<!-- 注册中央调度器 -->
<servlet>
<servlet-name>txg</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 执行springMVC配置文件的位置以及文件名 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!-- 表示在启动tomcat服务器的时候就加载该servlet,数字越小,优先级越大 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>txg</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
配置springmvc-servlet.xml
这个xml文件,默认情况下是要和web.xml在一个目录下,且命名格式为servlet-name的值加上-servlet.xml。这样才能找到这个xml文件。如果不是默认的要求,则需要配置下面的<init-param>进行指定。
该xml文件是进行bean的注册的。
对于视图解析器,可以配置访问路径的前后缀,其原理就是字符串的拼接。
<?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: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/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 注册视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 访问路径前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 访问路径后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
<!-- 注册处理器
id以 / 开头的
.do形式的请求
当请求/my.do的时候,会访问相应的class,进行处理
-->
<bean id="/my.do" class="com.ambow.handlers.MyController"></bean>
</beans>
创建MyController类
实现Controller接口,并对MyController进行注册,在springmvc-servlet.xml中。
执行执行handleRequest方法,返回ModelAndView的对象。
mv.setViewName(“要显示的前端页面的路径,比如jsp的路径”)
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class MyController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception{
ModelAndView mv = new ModelAndView();
//其底层执行的是request.setAttribute()方法
mv.addObject("message", "hello SpringMVC");
mv.setViewName("welcome");
return mv;
}
}