J2EE开发 Spring MVC配置详解(非注解方式和注解方式)
首先,确保自己的开发环境正确
1.JDK 1.7+Spring3.x+Tomcat
2.JDK 1.8+Spring4.x+Tomcat
不能用JDK 1.8去编译Spring 3.x的版本开发,不然你会发现WEB-INF下的classes是空的。没有编译后的字节码文件
不能用JDK 1.8去编译Spring 3.x的版本开发,不然你会发现WEB-INF下的classes是空的。没有编译后的字节码文件
不能用JDK 1.8去编译Spring 3.x的版本开发,不然你会发现WEB-INF下的classes是空的。没有编译后的字节码文件
Spring 框架下载地址
http://repo.spring.io/release/org/springframework/spring/
我写这篇博文的时候选择的是4.2.4版本
接下来说非注解的具体配置
一。首先是web.xml应用总入口的配置
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>TxHelperServer</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-list>
<servlet>
<servlet-name>springMVC</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>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
Servlet是Java Web的核心,Spring MVC也不例外,Spring MVC里的前端控制器DispatcherServlet就是一个Servlet。
servlet-name可以自定义。我这里叫做springMVC
init-param的param-name可以通过查看源码的方式看到contextConfigLocation
param-value是Spring MVC配置文件的路径
我这里是在工程名下和src同级的新建了一个文件夹config,在config里新建了一个xml文件springmvc.xml
Spring MVC的主要配置会在springmvc.xml里
<load-on-startup>1</load-on-startup>
这个表示启动级别为1,当Tomcat启动时,应用也随之启动.
2.配置servlet-mapping
*.action表示所有以action结尾的URL请求都交给DispatcherServlet,虽然方便,但不利于实现RESTful
/ 表示全部请求都交由DispatcherServlet,此种配置可以实现RESTful,但会拦截静态资源文件,css/js/img。
出现这个问题的根本原因是因为,*.css *.js这些资源的URL也满足/的匹配,所以也交由DispatcherServlet来处理,但在后续的URL映射配置中,我们并没有给静态资源文件URL也配置对应的类,所以就会出现找不到URL映射的报错。
但如果是*.action或者*.do的话,这些.css .js不会被匹配到,自然就不会交给DispatcherServlet来处理。
解决这个问题方案是激活Tomcat的defaultServlet来处理静态文件
配置时加上如下
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
关于这个问题的解决方案,我这里只给出了这一种我采用的,还有其他的方案可以参考博文
http://blog.csdn.net/hello5orld/article/details/9407905
同时感谢解决方案原作者。
二.配置springmvc.xml(非注解方式)
(1)springmvc.xml
<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"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd ">
<!--1.配置自己写的Controller -->
<bean name="/userLogin.action" class="csu.lzw.ssm.controller.LoginController" />
<!--配置处理器映射器 -->
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<!--配置处理器适配器 -->
<bean
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<!--配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</beans>
1.处理器映射器
如果没有明确声明任何处理器映射,spring会默认使用BeanNameUrlHandlerMapping,我这里为了说明还是显式的配置了一下。
BeanNameUrlHandlerMapping这个类的作用是将配置的URL与对应的类映射起来。
2.处理器适配器
我们自己写的Controller都要去实现Controller接口,handleRequest方法。
这个
SimpleControllerHandlerAdapter
适配器能执行实现
Controller
接口的自己写的Controller。
3.视图解析器
InternalResourceViewResolver
这个解析器解析jsp页面中的Jstl标签,渲染Model数据,返回给用户.
所以在开发的时候,lib文件夹下要有jstl相关的jar包,不然会报错
(2)关于处理器映射器非注解的还有一种配置方式,是另一个处理器映射器.
<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"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd ">
<!--1.配置自己写的Controller -->
<bean id="LoginController" class="csu.lzw.ssm.controller.LoginController" />
<!--另一种非注解的处理器映射器 -->
<bean
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/userLogin.action">LoginController</prop>
</props>
</property>
</bean>
<!--配置处理器适配器 -->
<bean
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<!--配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</beans>
大多数配置情况下都用这个映射器,方法也很简单,给每一个自己写的Controller一个id,然后对应URL的key就可以了。
SimpleUrlHandlerMapping
(3)另一种处理器适配器
HttpRequestHandlerAdapter.
要求编写的Controller实现 HttpRequestHandler接口。
第一种适配器实现Controller接口的handleRequest方法返回值是ModelAndView,可以理解成jsp视图地址和将要填充渲染的Model数据结构体吧
而现在这一种实现HttpRequestHandler接口的handlerRequest方法是void的,意味着要通过参数里的HttpServletRequest对象类似与早期开发Servlet的样式进行跳转和设置属性键值传递数据.
但这一种在一些场合一些需求也是有用武之地的,比如当需要返回json字符串的时候。
使用此方法可以通过修改response,设置响应的数据格式,比如响应json数据
/*
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json字符串");*/
基本上非注解的配置就说完了。
最后上一个我测试用的LoginController类,实现了Controller接口使用SimpleControllerHandlerAdapter适配器配置
LoginController.java
package csu.lzw.ssm.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.http.HttpRequest;
import org.springframework.web.HttpRequestHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class LoginController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
System.out.println("login ok");
return new ModelAndView("/WEB-INF/main.jsp");
}
}
最后,实际上,在配置文件里只需要配置自己写的Controller就行了,其他的Spring会采用默认的映射器,适配器,视图解析器。
在/org/springframework/web/servlet/DispatcherServlet.properties文件下。
文件内容如下
# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\
org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
可以看到默认的映射器,适配器,视图解析器
也就是配置文件完全可以这样配置
<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"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd ">
<!--1.配置自己写的Controller -->
<bean name="/userLogin.action" class="csu.lzw.ssm.controller.LoginController" />
</beans>
三.配置springmvc.xml(注解方式)
是用注解方式必须保证映射器和适配器都采用注解包下的,必须配套使用,不能一个注解一个非注解
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
注解映射器
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.class
注解适配器
可以使用mvc标签替代上面两个。
<!--使用 mvc:annotation-driven代替上边注解映射器和注解适配器配置
mvc:annotation-driven默认加载很多的参数绑定方法,
比如json转换解析器就默认加载了,如果使用mvc:annotation-driven不用配置上边的RequestMappingHandlerMapping和RequestMappingHandlerAdapter
实际开发时使用mvc:annotation-driven
-->
<!--<mvc:annotation-driven></mvc:annotation-driven> -->
context:component-scan为设置注解扫描包,将包下的Controller转为bean
springmvc.xml
<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"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd ">
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 把标记了@Controller注解的类转换为bean -->
<context:component-scan base-package="csu.lzw.ssm.controller" />
</beans>
自己写注解的Controller
package csu.lzw.ssm.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class LoginController{
@RequestMapping("/userLogin")
public ModelAndView userLogin() throws Exception {
// TODO Auto-generated method stub
System.out.println("login ok");
return new ModelAndView("/WEB-INF/main.jsp");
}
}