Struts2、Spring MVC、Webx对比-阿里云开发者社区

开发者社区> 开发与运维> 正文

Struts2、Spring MVC、Webx对比

简介:

一、struts2简单样例

步骤1:filter拦截请求,为了防止对初始页面拦截,使用/*.action,而不是/*


  1. <filter> 
  2.         <filter-name>struts2</filter-name> 
  3.         <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> 
  4.     </filter> 
  5.     <filter-mapping> 
  6.         <filter-name>struts2</filter-name> 
  7.         <url-pattern>/*.action</url-pattern> 
  8.     </filter-mapping> 
  9.  
  10.     <welcome-file-list> 
  11.         <welcome-file> 
  12.             index.html 
  13.         </welcome-file> 
  14.     </welcome-file-list> 

 

步骤2:Action处理,可以继承自xwork2的ActionSupport类;也可以不继承,但必须有public String execute() throws Exception方法


  1. private String username; 
  2. private String password; 
  3.  
  4. @Override 
  5. public String execute() throws Exception { 
  6.     if (username == null || username.equals("")) { 
  7.         return ERROR; 
  8.     } 
  9.     return SUCCESS; 

步骤3:在classpath下面(src/main/java或者src/main/resources),配置struts.xml


  1. <?xml version="1.0" encoding="UTF-8" ?> 
  2. <!DOCTYPE struts PUBLIC 
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" 
  4.     "http://struts.apache.org/dtds/struts-2.1.7.dtd"> 
  5.  
  6. <struts> 
  7.     <package name="struts" extends="struts-default" namespace="/"> 
  8.         <action name="login" class="com.alibaba.struts2.LoginAction"> 
  9.             <result name="success" type="dispatcher">/success.jsp</result> 
  10.             <result name="error" type="dispatcher">/fail.jsp</result> 
  11.         </action> 
  12.     </package> 
  13. </struts> 

步骤4:在页面提交表单给action处理('/'代表从根webapp开始找,否则代表从当前页面所在目录下找),其中.action是从struts.properties中继承而来的(struts.action.extension=action,,)


  1. <body> 
  2.     <form method="get" action="/login.action"> 
  3.         <table> 
  4.             <tr> 
  5.                 <th><label for="username">用户名</label></th> 
  6.                 <td><input type="text" id="username" name="username" /></td> 
  7.             </tr> 
  8.             <tr> 
  9.                 <th><label for="password">密码</label></th> 
  10.                 <td><input type="text" id="password" name="password" /></td> 
  11.             </tr> 
  12.             <tr> 
  13.                 <th><label for="submit"></label></th> 
  14.                 <td> 
  15.                     <button type="submit" id="submit" name="submit">submit</button> <label 
  16.                     for="reset"></label> 
  17.                     <button type="reset" id="reset" name="reset">reset</button> 
  18.                 </td> 
  19.             </tr> 
  20.  
  21.         </table> 
  22.     </form> 
  23. </body> 

步骤5:取得属性


  1. username:<%=request.getParameter("username") %><br> 
  2. username: ${param.username} 

【注意】EL表达式在Servlet2.5中默认禁用,需要开启:<%@ page isELIgnored="false" %>, 更多内容参考:http://tianya23.blog.51cto.com/1081650/678052

【注意】

(1)获取从ActionContext中获取session,而不需要直接使用HttpServletRequest和HttpServletResponse。


  1. ActionContext context = ActionContext.getContext(); 
  2.         context.put("k1""v1"); 
  3.         Map session = context.getSession(); 
  4.         session.put("k2""v2"); 

 

二、Spring MVC使用样例

步骤1:添加Spring的相关依赖


  1. <dependency> 
  2.     <groupId>com.alibaba.external</groupId> 
  3.     <artifactId>java.servlet</artifactId> 
  4.     <version>2.5</version> 
  5. </dependency> 
  6. <dependency> 
  7.     <groupId>com.alibaba.external</groupId> 
  8.     <artifactId>sourceforge.spring.modules.webmvc</artifactId> 
  9.     <version>2.5.6</version> 
  10. </dependency> 
  11. <dependency> 
  12.     <groupId>com.alibaba.external</groupId> 
  13.     <artifactId>sourceforge.spring.modules.core</artifactId> 
  14.     <version>3.0.5.RELEASE</version> 
  15. </dependency> 
  16. <dependency> 
  17.     <groupId>com.alibaba.external</groupId> 
  18.     <artifactId>sourceforge.spring.modules.beans</artifactId> 
  19.     <version>3.0.5.RELEASE</version> 
  20. </dependency> 
  21. <dependency> 
  22.     <groupId>com.alibaba.external</groupId> 
  23.     <artifactId>sourceforge.spring.modules.context</artifactId> 
  24.     <version>3.0.5.RELEASE</version> 
  25. </dependency> 
  26. <dependency> 
  27.     <groupId>com.alibaba.external</groupId> 
  28.     <artifactId>sourceforge.spring.modules.context-support</artifactId> 
  29.     <version>3.0.5.RELEASE</version> 
  30. </dependency> 
  31. <dependency> 
  32.     <groupId>com.alibaba.external</groupId> 
  33.     <artifactId>sourceforge.spring.modules.web</artifactId> 
  34.     <version>3.0.5.RELEASE</version> 
  35. </dependency> 
  36. <dependency> 
  37.     <groupId>com.alibaba.external</groupId> 
  38.     <artifactId>sourceforge.spring.modules.aop</artifactId> 
  39.     <version>3.0.5.RELEASE</version> 
  40. </dependency> 
  41. <dependency> 
  42.     <groupId>com.alibaba.external</groupId> 
  43.     <artifactId>jakarta.commons.logging</artifactId> 
  44.     <version>1.1.1</version> 
  45. </dependency> 
  46. <dependency> 
  47.     <groupId>org.springframework</groupId> 
  48.     <artifactId>spring-asm</artifactId> 
  49.     <version>3.0.6.RELEASE</version> 
  50. </dependency> 
  51. <dependency> 
  52.     <groupId>com.alibaba.external</groupId> 
  53.     <artifactId>sourceforge.spring.modules.expression</artifactId> 
  54.     <version>3.0.5.RELEASE</version> 
  55. </dependency> 

步骤2:在web.xml中配置spring mvc的入口


  1. <servlet> 
  2.     <servlet-name>springmvc</servlet-name> 
  3.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
  4.     <load-on-startup>1</load-on-startup> 
  5. </servlet> 
  6. <servlet-mapping> 
  7.     <servlet-name>springmvc</servlet-name> 
  8.     <url-pattern>*.test</url-pattern> 
  9. </servlet-mapping> 

也可以指定spring servlet拦截之后,Spring mvc的配置文件


  1. <servlet> 
  2.     <servlet-name>hello</servlet-name> 
  3.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
  4.     <init-param> 
  5.      <param-name>contextConfigLocation</param-name> 
  6.      <param-value>/WEB-INF/classes/*.xml</param-value> 
  7.     </init-param> 
  8.     <load-on-startup>1</load-on-startup> 
  9.   </servlet> 
  10.   
  11.  <servlet-mapping> 
  12.     <servlet-name>hello</servlet-name> 
  13.     <url-pattern>*.do</url-pattern> 
  14.   </servlet-mapping> 

【注意】

1、在src源下面的文件,都将被映射到/WEB-INF/classes/下面,可以使用通配符。


  1. <init-param>     
  2.             <param-name>contextConfigLocation</param-name>                
  3.             <!--       
  4.               指定XML文件位置      
  5.               <param-value>/WEB-INF/classes/springmvc.xml                 
  6.               <param-value>classpath*:springmvc.xml      
  7.              -->     
  8.              <!-- 在classpath路径下去寻找springmvc.xml文件 -->                
  9.              <param-value>classpath:springmvc.xml      
  10.             </param-value>     
  11.         </init-param>    

2、<load-on-startup>1</load-on-startup> 让容器启动的时候就加载配置文件

 

 

步骤3:如果没有指定spring mvc的映射文件名称,默认使用:在WEB-INF目录下的*-servlet.xml文件,其中*为web.xml中配置的servlet-name。本例为:springmvc,则寻找的配置文件为:springmvc-servlet.xml,里面的配置如下:


  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <beans xmlns="http://www.springframework.org/schema/beans" 
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:lang="http://www.springframework.org/schema/lang" 
  4.     xsi:schemaLocation="  
  5. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  6. http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.5.xsd"> 
  7.  
  8.     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
  9.         <property name="mappings"> 
  10.             <props> 
  11.                 <prop key="start.test">LoginSpringAction</prop> 
  12.             </props> 
  13.         </property> 
  14.     </bean> 
  15.     <bean id="LoginSpringAction" class="com.alibaba.spring.LoginSpringAction"></bean> 
  16.      
  17.     <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
  18.         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> 
  19.         <property name="prefix" value="/WEB-INF/jsp/"/> 
  20.         <property name="suffix" value=".jsp"/> 
  21.     </bean> 
  22. </beans> 

解释:如果start.test访问,则使用com.alibaba.spring.LoginSpringAction进行处理。

处于jsp页面隐藏的考虑,放在/WEB-INF目录下,按照跳转要求,则找/WEB-INF/jsp/start1.jsp页面。其中start1是由Controller继承类中new ModelAndView("start1")决定的。前缀和后缀是在*-servlet.xml中指定的,本例为springmvc-servlet.xml。

  【注意】如果需要使用注解annotation的方式,在需要引入context和mvc命名空间,具体如下:


  1. <?xml version="1.0" encoding="UTF-8"?>      
  2.   <beans xmlns="http://www.springframework.org/schema/beans"        
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
  4.        xmlns:p="http://www.springframework.org/schema/p"        
  5.        xmlns:context="http://www.springframework.org/schema/context"    
  6.        xmlns:mvc="http://www.springframework.org/schema/mvc"       
  7.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd      
  8.        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd      
  9.        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd      
  10.        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd   
  11.        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"   
  12.         default-autowire="byName">      
  13.    
  14.      
  15. </beans>   

 

 

 

 

步骤4:LoginSpringAction.java文件


  1. import javax.servlet.http.HttpServletRequest; 
  2. import javax.servlet.http.HttpServletResponse; 
  3.  
  4. import org.springframework.web.servlet.ModelAndView; 
  5. import org.springframework.web.servlet.mvc.Controller; 
  6.  
  7. public class LoginSpringAction implements Controller { 
  8.  
  9.     @Override 
  10.     public ModelAndView handleRequest(HttpServletRequest request, 
  11.             HttpServletResponse response) throws Exception { 
  12.         String username = request.getParameter("username"); 
  13.         String password = request.getParameter("password"); 
  14.         System.out.println("username:" + username + ", password:" + password); 
  15.  
  16.         return new ModelAndView("start1"); 
  17.     } 

【注意】使用annotation方式,可以避免耦合方式,也方便单元测试 

setp 1:为controller的类添加注解:@Controller  

setp 2:为方法添加@RequestMapping

在类级别定义:@RequestMapping("/test"),该类的根级别,可选

在方法上定义:@RequestMapping("/start"),相对与类级别,必选,访问方式:/test/start.do

setp 3:在spring servlet配置文件中添加扫描功能,使annotation产生作用

  1.   <!-- 把标记了@Controller注解的类转换为bean -->       
  2.       <context:component-scan base-package="test.controller" />   

 

setp 4:在spring servlet中使用视图解析类,如UrlBasedViewResolver, 在里面配置前缀和后缀,viewClass属性为可选

 

 

步骤5:启动jetty访问,url:http://localhost:8080/start.test, 则后台输出:Controller is working

补充:制作一个index.jsp页面开始运转


  1. <%@ page language="java" contentType="text/html; charset=utf-8" 
  2.     pageEncoding="gbk"%> 
  3.  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
  5. <html> 
  6. <h2>Hello World!</h2> 
  7. <body> 
  8.     <form method="get" action="/start.test"> 
  9.         <table> 
  10.             <tr> 
  11.                 <th><label for="username">用户名</label> 
  12.                 </th> 
  13.                 <td><input type="text" id="username" name="username" /> 
  14.                 </td> 
  15.             </tr> 
  16.             <tr> 
  17.                 <th><label for="password">密码</label> 
  18.                 </th> 
  19.                 <td><input type="text" id="password" name="password" /> 
  20.                 </td> 
  21.             </tr> 
  22.             <tr> 
  23.                 <th><label for="submit"></label> 
  24.                 </th> 
  25.                 <td> 
  26.                     <button type="submit" id="submit" name="submit">submit</button> <label 
  27.                     for="reset"></label> 
  28.                     <button type="reset" id="reset" name="reset">reset</button></td> 
  29.             </tr> 
  30.  
  31.         </table> 
  32.     </form> 
  33. </body> 
  34. </html> 

访问:http://localhost:8080/index.jsp

【补充】

(1)对于不需要的controller的login.jsp页面,可以使用spring自带的org.springframework.web.servlet.mvc.ParameterizableViewController,而不需要自己再写controller的实现。具体配置如下:


  1. <bean id="LoginAction" 
  2.         class="org.springframework.web.servlet.mvc.ParameterizableViewController"> 
  3.         <property name="viewName" value="login"></property> 
  4.     </bean> 

它会根据策略寻找到/WEB-INF/jsp/login.jsp

(2)如果login.test直接找login.jsp,即login是一致的,不需要改变,则可以更加省略,直接写为:


  1. <bean id="LoginAction" 
  2.         class="org.springframework.web.servlet.mvc.UrlFilenameViewController" /> 

 三、Webx MVC(以webx3为基础)

1、webx3的入口点


  1. <filter> 
  2.        <filter-name>webx</filter-name> 
  3.        <filter-class>com.alibaba.citrus.webx.servlet.WebxFrameworkFilter</filter-class> 
  4.    </filter> 
  5.    <filter-mapping> 
  6.        <filter-name>webx</filter-name> 
  7.        <url-pattern>/*</url-pattern> 
  8.    </filter-mapping> 

webx.xml:每个webx应用,都需要有一个webx.xml配置文件。这个文件定义了Webx所用到的所有services的配置。

pipeline.xml:即管道,它是由一个或多个“阀门Valve”构成的。可以看做webx框架的总控文件。

log4j.xml:日志系统配置文件。对于程序的排错至关重要。



本文转自 tianya23 51CTO博客,原文链接:http://blog.51cto.com/tianya23/678001,如需转载请自行联系原作者

版权声明:本文首发在云栖社区,遵循云栖社区版权声明:本文内容由互联网用户自发贡献,版权归用户作者所有,云栖社区不为本文内容承担相关法律责任。云栖社区已升级为阿里云开发者社区。如果您发现本文中有涉嫌抄袭的内容,欢迎发送邮件至:developer2020@service.aliyun.com 进行举报,并提供相关证据,一经查实,阿里云开发者社区将协助删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章