J2EE开发 Spring MVC配置详解(非注解方式和注解方式)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lizhaowei213/article/details/50634912

首先,确保自己的开发环境正确

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。


配置DispatcherServlet

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不用配置上边的RequestMappingHandlerMappingRequestMappingHandlerAdapter

   实际开发时使用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");
	}

}




猜你喜欢

转载自blog.csdn.net/lizhaowei213/article/details/50634912