SpringMVC与struts2区别和第一个springMVC应用

Posted AngusC·

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC与struts2区别和第一个springMVC应用相关的知识,希望对你有一定的参考价值。

首先先从网上找到一篇描述SpringMVC和Struts2的区别的文章

更多资源访问www.yyjava.com

文章转载路径:http://blog.csdn.net/chenleixing/article/details/44570681

下面是原文:

更多资源访问www.yyjava.com

1、Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。

2、由上边原因,SpringMVC的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量,而Struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码 读程序时带来麻烦,每次来了请求就创建一个Action,一个Action对象对应一个request上下文
3、由于Struts2需要针对每个request进行封装,把request,session等servlet生命周期的变量封装成一个一个Map,供给每个Action使用,并保证线程安全,所以在原则上,是比较耗费内存的

4、 拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。

5、SpringMVC的入口是servlet,而Struts2是filter(这里要指出,filter和servlet是不同的。以前认为filter是servlet的一种特殊),这就导致了二者的机制不同,这里就牵涉到servlet和filter的区别了。

6、SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。

7、SpringMVC验证支持JSR303,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱。

8、spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)。

更多资源访问www.yyjava.com

9、 设计思想上,Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。

10、SpringMVC开发效率和性能高于Struts2。
11、SpringMVC可以认为已经100%零配置


上面是转载的原文,对SpringMVC和Struts2的区别说得很到位,而且关键点都用红字标了出来。那下面我们来说说如何使用SpringMVC:

更多资源访问www.yyjava.com

我们这个例子就是简单介绍如何接收页面传来的数据,我们后面会继续说如何用RESTful 风格 post,如何返回JSON数据,自定义拦截器,文件上传等功能。

1、用一个框架的时候我们得先把他的各种jar包下好。下面这些是我的jar,我已经打包好上传到百度云了,这是下载地址:http://pan.baidu.com/s/1ckL5wU



更多资源访问www.yyjava.com




2、然后我们在src文件下新建一个名为springmvc-servlet.xml的配置文件,为啥叫这名呢,可以看一下web.xml文件里面设置的,这个配置文件的各种功能我已经在下面的注释中标出来了。

更多资源访问www.yyjava.com
<span style="font-size:14px;"><?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:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
	<!-- 配置自动扫描的包 -->
	<context:component-scan base-package="com.chj.spring.actions">
	</context:component-scan>
	<!-- 
		在springMVC-servlet.xml中配置<mvc:default-servlet-handler />后,
		会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,
		它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求
		,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。 
	-->
	 <mvc:default-servlet-handler />

       <!--该标签对应多个解析类  用来处理注解 -->
	 <mvc:annotation-driven /> 
	 
	 <!-- 当一个请求结束后springMVC会返回一个视图名称(比如一个jsp名字)
	 	  以下配置会把该名称与下面配置中指定的前缀和后缀拼起来作为一个完整路径
	  -->
	 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
            id="internalResourceViewResolver">
        <!-- 表示需要使用jstl -->
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <!-- 前缀 -->
        <property name="prefix" value="/content/person/" />
        <!-- 后缀 -->
        <property name="suffix" value=".jsp" />
    </bean>
</beans>
</span>

这里我们还需要配置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>spring-mvc</display-name>
  <!-- 启动 IOC 容器的 ServletContextListener -->
  <!-- 配置 Spring 配置文件的名称和位置 -->
  <context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:resource/applicationContext.xml</param-value>
  </context-param>
  <listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <servlet>
  	<!-- 注册springMVC前置控制器,它会拦截请求,并将请求依据用户定义好的规则分发到目标Controller处理 -->
  	<servlet-name>springmvc</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>classpath:resource/springmvc-servlet.xml</param-value>
  	</init-param>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>springmvc</servlet-name>

               <!-- 注意是/   不是/*  ,但是这样一来也会拦截静态文件,比如js/css/image等-->
  		<url-pattern>/</url-pattern>
  		<!-- <url-pattern>*.do</url-pattern> -->
  </servlet-mapping>

 <!-- 浏览器form表单只支持GET与POST请求,而DELETE、PUT等method并不支持,spring添加了一个过滤器,
  	         可以将这些请求转换为标准的http方法,使得支持GET、POST、PUT与DELETE请求 -->
  <filter>
	    <filter-name>HiddenHttpMethodFilter</filter-name>
	    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  </filter>
  <filter-mapping>
	    <filter-name>HiddenHttpMethodFilter</filter-name>
	    <servlet-name>springmvc</servlet-name>
  </filter-mapping>
  <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>
</web-app>

我们写一个前台传数据的test.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'test.jsp' starting page</title>

  </head>
  
  <body>
   	@RequestParam
    <form action="${pageContext.request.contextPath}/person/param" method="post">
    	<input type="text" name="id">
    	<input type="text" name="name">
    	<input type="submit" value="submit">
    </form>
  </body>
</html>

可以看到我们action的url是
${pageContext.request.contextPath}/person/param
这个url是在我们的action里面

这是我的action类,对action类我会进行一一解释

@Controller
@RequestMapping("/person")//注解为控制器指定可以处理哪些 URL 请求,跟struts2中的命名空间作用一样
public class PersonAction{
	
	/**
	 * 使用@RequestParam注解指定参数的name
	 * 注解指定参数名称
	 */
   @RequestMapping(value="/param")
    public String testRequestParam(@RequestParam(value="id") Integer id,
            @RequestParam(value="name",required=false)String name){
        System.out.println(id+" "+name);
        return "person";
    }  
	
	
}
我们来解释一下

@Controller
这是说明这个类是需要创建实例的,只有这个在配置文件中进行自动扫描包的时候才会把这个类给实例化

@RequestMapping("/person")
这个相当于我们struts2里面的别名,如果类少可以不用,但如果action类多就需要起别名来区别了

@RequestMapping(value="/param")
这个就相当与我们struts2的action的name,只有起这个了url才能访问到这个方法,springmvc是方法级别拦截。

@RequestParam(value="id")
这个就相当于我们从参数传回来的参数名,可以用来提取名为“id”的intrger类型的参数,并将之作为输入参数传入
从上面我们可以看到,struts2和spring mvc的区别非常明显,struts2使用原型,spring mvc使用单例。

 return "person";
这里我们就需要看我们的配置文件了。我们看我们上面的的springmvc的配置文件我们会发现

 <!-- 当一个请求结束后springMVC会返回一个视图名称(比如一个jsp名字)
	 	  以下配置会把该名称与下面配置中指定的前缀和后缀拼起来作为一个完整路径
	  -->
	 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
            id="internalResourceViewResolver">
        <!-- 表示需要使用jstl -->
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <!-- 前缀 -->
        <property name="prefix" value="/content/person/" />
        <!-- 后缀 -->
        <property name="suffix" value=".jsp" />
    </bean>

而我的项目里面有那么一个jsp,相信聪明的你知道返回那个字符串转发到哪里了吧。就是转发到我们在配置文件里面指定路径下面的文件。


我们可以测试一下,看看传值是否成功。

我们可以看到传值过来成功了,并且成功转发了。

通过本文,主要说了以下:

1、在web.xml中配置DispatcherServlet核心控制器

2、在WEB-INF文件夹中添加xml配置文件

3、@Controller、@RequestMapping和@RequestParam的作用。



以上是关于SpringMVC与struts2区别和第一个springMVC应用的主要内容,如果未能解决你的问题,请参考以下文章

简要比较SpringMVC与Struts2的区别

SpringMVC与Struts2区别

SpringMVC与Struts2区别与比较

SpringMVC与Struts2的主要区别

SpringMVC与Struts2区别与比较总结

SpringMVC与Struts2区别与比较总结