从struts 1.x升级到 struts 2(一) 第一个程序

来源:互联网 发布:广州淘宝商家 编辑:程序博客网 时间:2024/06/05 06:59
Struts 2与Struts 1.x间的差比很大,从用户体验而言,基本上可以认为是两个完全不同的系统。当然,出于兼容性,原先的struts 1.x 框架下的项目仍然可以在struts 2 下运行。struts 2的MVC框架源于WebWork,有关struts 2与WebWork的关系,感兴趣的人可以去搜查相关资料,这里不再多说。

struts 2也出来很长时间了,但仍有很多人仍然在使用struts 1.x,这也是写本文的原因,本文的内容主要是当年我升级到struts 2时的笔记。因此,本文一开始的示例程序会带有比较浓重的struts 1的风格,而非典型的struts2 风格。所以,如果是新人,想学struts 2的话,不建议看本文,就如同在学习JDK 6时,没有必要先去弄本JDK5的教材一样。

本例使用Eclipse + Lomboz完成,网页文件的主目录为WebContent,项目名为tutorial。

本着越简单越好的原则,本项目中包含以下几个文件:

文件名 所在位置 说明 web.xml WebContent/WEB-INF   login.jsp WebContent 登录页面 success.jsp WebContent 登录成功后显示的页面 error.jsp WebContent 登录失败后显示的页面 LoginAction.java src/example 处理登录请求的servlet struts.xml src struts2的配置文件 example.xml src Servlet与JSP间的MVC映射配置文件

另外,需要引用strus2中的如下类库:

  • commons-logging-1.0.4.jar
  • freemarker-2.3.8.jar
  • ognl-2.6.11.jar
  • struts2-core-2.0.9.jar
  • xwork-2.0.4.jar

web.xml


<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" 
    xmlns
="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    
<display-name>Tutorial</display-name>

    
<filter>
        
<filter-name>struts2</filter-name>
        
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    
</filter>

    
<filter-mapping>
        
<filter-name>struts2</filter-name>
        
<url-pattern>/*</url-pattern>
    
</filter-mapping>

    
<welcome-file-list>
        
<welcome-file>login.jsp</welcome-file>
    
</welcome-file-list>

</web-app>

上面的代码中,<filter>及<filter-mapping>是struts2需要的配置。另外,将默认的首页设为login.jsp

在此将映射模板设为了/*,表示一切以.action结尾的请求均由struts2来处理。

login.jsp

<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding
="GB18030"
%>
<html>
<head>
<title>Login</title>
</head>
<body>
<form name="form1" action="/tutorial/example/Login.action" method="post">
    user name: 
<input type="text" name="UserName" />  <br />
    password: 
<input type="password" name="Password" /> <br />
    
<input type="submit" value="Submit" />
</form>
</body>
</html>

界面上就两个输入框和一个提交按钮。


success.jsp

<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding
="GB18030"
%>
<html>
<head>
<title>Login Success</title>
</head>
<body>
<p>user name: <%=request.getAttribute("UserName"%></p>
<p>password: <%=request.getAttribute("Password"%></p>
</body>
</html>

error.jsp

<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding
="GB18030"
%>
<html>
<head>
<title>Login Failed</title>
</head>
<body>
<p>Login failed!</p>
</body>
</html>

LoginAction.java

package example;

import javax.servlet.http.HttpServletRequest;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.ServletRequestAware;

public class LoginAction extends ActionSupport implements ServletRequestAware 
{
    
private HttpServletRequest request;
    
    
public void setServletRequest(HttpServletRequest request) 
    
{
        
this.request = request;    
    }

    
    
public String execute() throws Exception 
    
{
        String user_name 
= this.request.getParameter("UserName");
        String password 
= this.request.getParameter("Password");
        
if(user_name.equals("lld"&& password.equals("lld"))
        
{
            
this.request.setAttribute("UserName", user_name);
            
this.request.setAttribute("Password", password);
            
return "success";
        }
else
            
return "failed";
            
    }


}

该servlet类从页面接受用户名和口令,如果两个都是“lld”,则认为是正确,否则登录失败。

注意,如果使用struts2,所有的action类都要是com.opensymphony.xwork2.ActionSupport继承类,但这里还实现了org.apache.struts2.interceptor.ServletRequestAware接口,因为出于使用struts 1.x版本的习惯,我需要在这里使用request对象,只要实现一个setServletRequest方法即可,struts2会自动调用该方法,将request作为参数传入。这并不是struts推荐的方式,在以后的章节中我会继续讲如何使用struts提供的功能完成使用request对象的功能。

struts.xml

该文件位于src目录下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
>

<struts>

    
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
    
<constant name="struts.devMode" value="false" />

    
<include file="example.xml" />

</struts>

 

该配置文件将example.xml包括进来,我在example.xml定义了MVC映射,在struts.xml中可包含多个MVC映射文件。struts.xml为固定文件名,不能更改。

example.xml

该文件位于src目录下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd"
>

<struts>

    
<package name="example" namespace="/example" extends="struts-default">

        
<action name="Login" class="example.LoginAction">
            
<result name="success">/success.jsp</result>
            
<result name="failed">/error.jsp</result>
        
</action>

    
</package>
</struts>

这里需要详细解释一下,package中定义了一系列的映射,我们可以把一组相关的映射放到一个package中,其name属性可为任意值,只是标识该package的名称,另外,该package的名称与Java类的package没有任何关系。

package的namespace属性需要与提交的请求名吻合,例如在login.jsp中,我将form.action设为了/tutorial/example/Login.action,其中/tutorial为根目录,而后面的/example则需要与该package的namespace属性吻合。

package的extends属性为“struts-default”,一般情况下不需要修改该值。

在example.xml中,我只定义了一个映射,其name属性值为Login,与login.jsp中的Login.action对应。在struts2中,默认情况下以.action结尾的提交请求均由struts2处理。

action.class属性定义了servlet处理类的全路径名。

action的两个子结点表示当action.execute()方法返回值为“success”时,跳转到/success.jsp页面,而返回值为“failed”时,则跳转到error.jsp,而如果在Servlet类中返回的是预定义静态变量SUCCESS,则可以省略name属性。

原创粉丝点击