posts - 297,  comments - 1618,  trackbacks - 0
 

说明:本文经过笔者对struts2.0.8自带的实例struts2-blank-2.0.8学习而写,对该例子进行了部分修改,希望对广大象要学习struts2的朋友有所帮助。

一.             实例说明

 本例是Struts2的简单实例,通过本工程的学习,我们将会对struts2的表单以及表单验证有一个初步的认识、了解struts2的配置以及初探Struts2的本地化输出。

二.             编码准备

1. 包的引入

MyEclipseNetBeans中建立web工程,将所需的包放入WebRoot/lib目录中,本实例所需的包有:

 commons-logging-1.1.jar

 freemarker-2.3.8.jar

 ognl-2.6.11.jar

 struts2-core-2.0.8.jar

 xwork-2.0.3.jar

 这些包在struts-2.0.8-all\struts-2.0.8\lib目录下都可以找到,请读者自行下载。

2. web.xml的配置

要使struts能正常工作,需修改web.xml的内容,为其增加struts2FilterDispatcher,修改后的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>Struts Blank</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>index.html</welcome-file>
    
</welcome-file-list>

</web-app>

3. 建立源码目录和jsp存放目录

 src目录下建立example文件夹,用于存放本实例的java文件等。在WebRoot文件夹下建立子文件夹example,用于存放本工程的jsp文件。

三.             编码

1.       Welcome.jspLogin.jsp的编写

首先我们建立Welcome.jsp,该文件包含两个链接,点击“登录”链接后跳转到登录信息输入页面,点击“注册”按钮跳转到注册页,为了学习struts2配置中的通配符使用,我们暂不实现注册功能。Welcome.jsp的代码如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    
<title>欢迎界面</title>
    
<link href="<s:url value="/css/examplecss"/>" rel="stylesheet" type="text/css"/>
</head>

<body>
    
<h3>导航</h3>
    
<ul>
        
<li><href="<s:url value="/example/Login.jsp"/>">登录</a></li>
        
<li><href="<s:url action="Register"/>">注册</a></li>
    
</ul>
</body>
</html>
 

在该页面的顶部,我们需要将struts2的标签库引入,语句为:<%@ taglib prefix="s" uri="/struts-tags" %>

在该页面,主要用到struts2<s:url>标签,该页面主要用到该标签的两个属性,分别为valueaction,其中action属性表示用action来产生url,而value表示使用的目标值。在页面上点击“查看源文件”按钮,可看到生成的语句分别变为:

<link href="/struts2-blank-2.0.8/css/examplecss" rel="stylesheet" type="text/css"/>

<a href="/struts2-blank-2.0.8/example/Login.jsp ">

<a href="/struts2-blank-2.0.8/example/Register.action">

由此可知使用该标签时,struts2会自动为我们带上下文路径,对于加了属性action<s:url>标签,后面会自动带上“.action”作为后缀。

 点击“登录”链接后,跳转到Login.jsp页面,该页包含一个登录表单,让用户输入用户名和密码信息,用户点击提交按钮,跳转到指定的Action——Login进行处理。Login.jsp的内容如下:

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    
<title>登录</title>
</head>
<body>
<s:form action="Login">
    
<s:textfield name="username" label="用户名"/>
    
<s:password name="password"  label="密码"/>
    
<s:submit/>
</s:form>
</body>
</html>

该页用到Struts2的表单标签<s:form><s:textfield><s:password>

 <s:form>action属性表示表单提交后跳转的action的名称,此处为Login,该标签最终将生成HTMLform

 <s:textfield>标签类同于HTML<input type=”text” …>,其中name表示属性域的名称,label表示其前的提示名;

 <s:password>标签类同于HTML<input type=”password” …>,其namelabel类同于<s:textfield>,在此略。

2.       配置文件struts.xmlexample.xml

在上述jsp页面,我们需跳转到两个Action地址,需在struts2的配置文件中配置,因当工程变大时,一个庞大的struts2的配置极难维护,建议按包路径分开配置文件,所以本实例除了struts.xml配置文件外,还新增了一个额外的配置文件example.xml。该文件在struts.xml中引用。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"/>
    
<!-- Add packages here -->
</struts>

可看到该文件通过<include file="example.xml"/>example.xml也作为struts2的配置文件。

接下来,让我们看看example.xml的配置:

<?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_input" class="example.Login">
            
<result name="input">/example/Login.jsp</result>
            
<result type="redirect-action">Menu</result>
        
</action>
        
<!-- 为学习struts2配置文件中通配符的使用,我们将未定义的action的引用都定向到example.ExampleSupport这个Action中, -->
        
<!-- 需定向的Action的名字传到{1}中,eg.若请求Register这个action,当ExampleSupport返回success时,跳转到/example/Register.jsp -->
        
<action name="*" class="example.ExampleSupport">
            
<result>/example/{1}.jsp</result>
        
</action>
    
</package>
</struts>

3.       LoginExampleSupport类以及验证配置类Login-validation.xml的编写

在配置文件example.xml中,定义了两个Action,下面我们用代码来实现这两个Action

首先让我们来看看ExampleSupport这个Action,这个Action不做任何操作,集成自ActionSupport,是本工程的各Action类的基类,该类的代码如下:

package example;
import com.opensymphony.xwork2.ActionSupport;
public class ExampleSupport extends ActionSupport {
}


接着让我们来看看Login这个Action,该类继承自ExampleSupport类,该Action需实现的业务逻辑如下:

1)       当用户名(username)或密码(password)有一者或两者为空时,登录不成功,跳转到登录信息输入页面;

2)       当用户名(username)和密码(password)都不为空时,登录成功,跳转到主菜单页。

 对于用户名和密码的验证,我们可以先考虑在Login类中用代码实现的方式,此时该类的代码如下:
package example;

public class Login extends ExampleSupport {
    
public String execute() throws Exception {
        
if (isInvalid(getUsername())) 
            
return INPUT;
        
if (isInvalid(getPassword())) 
            
return INPUT;
        
return SUCCESS;
    }


    
private boolean isInvalid(String value) {
        
return (value == null || value.length() == 0);
    }


    
private String username;

    
public String getUsername() {
        
return username;
    }


    
public void setUsername(String username) {
        
this.username = username;
    }


    
private String password;

    
public String getPassword() {
        
return password;
    }


    
public void setPassword(String password) {
        
this.password = password;
    }


}


当工程变得愈发复杂时,这一小段一小段验证代码将会变得难以维护,出于此原因,我们可以考虑采用struts2提供的验证机制来实现。在src目录下建立实现验证的xml文件Login-validation.xml,为Login Action中的usernamepassword属性增加非空验证,验证配置如下:

<!DOCTYPE validators PUBLIC
        "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
        "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"
>

<validators>
    
<field name="username">
        
<field-validator type="requiredstring">
            
<message key="requiredstring"/>
        
</field-validator>
    
</field>
    
<field name="password">
        
<field-validator type="requiredstring">
            
<message key="requiredstring"/>
        
</field-validator>
    
</field>
</validators>

当验证未通过时,将不会进入Login Action中的execute方法,此时可删除掉Login这个Action中的验证内容,该类的execute方法直接跳转到SUCCESS即可,修改后的代码略。

4. 本地化输出——资源文件package.properties

为了本地化的输出验证错误信息,我们可以将参数信息和错误信息放入资源文件中,资源文件package.properties位于src/example目录下,内容如下:

requiredstring = ${getText(fieldName)}不能为空.

password = 密码

username = 用户名

Missing.message = 该部分尚未构建,请稍候访问...

src/example目下下建立对应的中文资源文件package_zh_CN.properties,为了避免中文乱码问题,我们编写一个批处理文件code.bat来对package.properties进行编码处理,主要用到native2ascii命令,其内容如下:

del package_zh_CN.properties

copy package.properties package_zh_CN.properties.gbk

native2ascii -encoding GBK package_zh_CN.properties.gbk package_zh_CN.properties

del package_zh_CN.properties.gbk

del *.bak

运行该批处理文件,可在package_zh_CN.properties中可看到编码后的资源文件信息,如下:

requiredstring = ${getText(fieldName)}\u4e0d\u80fd\u4e3a\u7a7a.

password = \u5bc6\u7801

username = \u7528\u6237\u540d

Missing.message = \u8be5\u90e8\u5206\u5c1a\u672a\u6784\u5efa\uff0c\u8bf7\u7a0d\u5019\u8bbf\u95ee...

5. Register.jspMissing.jsp的编写

2中的example.xml中,我们配置了通配符映射,在Welcome.jsp中,我们使用

<a href="<s:url action="Register"/>">注册</a>

其中的Registerexample中找不到相关映射,于是在用户点击“注册”按钮时,将映射到通配符所映射的Actionexample. ExampleSupport.而后跳转到Register.jsp页面,其代码如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:include value="Missing.jsp"/>

该页面包含Missing.jsp页面,其代码如下:

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head><title>未构建页面</title></head>

<body>
<p>
    
<!-- 读取配置文件中的对应信息. -->
    
<s:text name="Missing.message"/>
</p>
</body>
</html>

四.总结

 到此为止,我们的实例已构建完,可通过浏览器访问:http://localhost:8080/struts2-blank-2.0.8/example/Welcome.jsp看到我们的劳动成果。下面总结一下我们在该实例中学到的东西。

1. 常用的一些标签的使用

在本实例中,我们学习了<s:textfield><s:password><s:form>以及<s:url>的使用。

2. 表单数据的验证

本文描述了一个简单的表单的数据非空验证。

3. 本地化输出错误提示信息

在验证失败时,用资源文件来输出错误提示信息。

4Strut2配置文件中通配符的使用

对于某些地址,我们可以使用在struts2的配置通配符来使其映射到某个Action中去。

下一篇:实例篇:struts2-mailreader-2.0.8实例学习

上一篇:基础篇:本地化输出

posted on 2007-08-02 15:25 阿蜜果 阅读(10766) 评论(13)  编辑  收藏 所属分类: Struts2


FeedBack:
# re: Struts2学习进阶(实例篇一)——struts2-blank-2.0.8实例学习
2007-08-03 11:59 | ehe
hehe....  回复  更多评论
  
# re: Struts2学习进阶(实例篇一)——struts2-blank-2.0.8实例学习
2007-08-03 17:11 | Thomas
非常棒,继续努力,加油!  回复  更多评论
  
# re: Struts2学习进阶(实例篇一)——struts2-blank-2.0.8实例学习
2007-08-06 11:39 | 五星-六日
搂主写的东西对我的工作帮助很大。感谢的说  回复  更多评论
  
# re: Struts2学习进阶(实例篇一)——struts2-blank-2.0.8实例学习
2007-08-22 12:15 | 何绍亲
很好,我也正在学习  回复  更多评论
  
# re: Struts2学习进阶(实例篇一)——struts2-blank-2.0.8实例学习
2007-08-29 16:21 | 阿干
不错。。。!
谢谢 谢星星。!
^_^!
luky-52@163.com  回复  更多评论
  
# re: Struts2学习进阶(实例篇一)——struts2-blank-2.0.8实例学习
2007-09-04 16:42 | tlb
我觉得,因该把学习中的BUG提出来,我学习这个例子遇到好多困难,最后还是各个击破了。现在spring struts2 结合起来,遇到问题,怎样定制错误叶面,根据exception 不同而现实msg,有兴趣可以讨论下 tlbfpx@163.com  回复  更多评论
  
# re: Struts2学习进阶(实例篇一)——struts2-blank-2.0.8实例学习
2007-09-22 08:24 | 阿信
楼主JJ,你好啊,有几个问题不懂,向你请教。

1:Welcome.jsp中,
<link href="<s:url value="/css/examplecss"/>" rel="stylesheet" type="text/css"/>
是不是要找一个CSS文件,好象没有啊。

2:example.xml中的{1}代表什么意思啊?
method="{1}" ,<result>/example/{1}.jsp</result>

3:为什么Login.jsp中的<s:form action="Login">的action名字和 .xml文件中<action name="Login_input" method="{1}" class="example.Login">不一样呢。  回复  更多评论
  
# re: Struts2学习进阶(实例篇一)——struts2-blank-2.0.8实例学习
2007-10-10 20:59 | lancy
提出楼主给的这个例子的几个错误:验证的xml文件应该放在包中;那个method={1}在这里应该去掉,否则出错;还有就是jsp中的那个action应该与xml中的action中的那个name一样,否则也会出错。
  回复  更多评论
  
# re: Struts2学习进阶(实例篇一)——struts2-blank-2.0.8实例学习[未登录]
2007-10-11 08:45 | 阿蜜果
@lancy
这篇是对struts2.0.8自带的实例struts2-blank-2.0.8学习而写,验证的xml文件应该放在包中,忘了说明了,呵呵
那个method={1}的是要去掉的,写文章的时候忘了
多谢提醒阿  回复  更多评论
  
# re: Struts2学习进阶(实例篇一)——struts2-blank-2.0.8实例学习
2007-11-01 18:29 | 中华信鸽
写的真不错呀.  回复  更多评论
  
# re: Struts2学习进阶(实例篇一)——struts2-blank-2.0.8实例学习
2007-11-10 16:33 | arewei
很不错!
谢谢啦!!  回复  更多评论
  
# re: Struts2学习进阶(实例篇一)——struts2-blank-2.0.8实例学习
2008-03-19 18:12 | tarzan
谢谢,做得很好  回复  更多评论
  
# re: Struts2学习进阶(实例篇一)——struts2-blank-2.0.8实例学习
2008-03-20 09:30 | df
@ehe
hehe  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2007年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

      生活将我们磨圆,是为了让我们滚得更远——“圆”来如此。
      我的作品:
      玩转Axure RP  (2015年12月出版)
      

      Power Designer系统分析与建模实战  (2015年7月出版)
      
     Struts2+Hibernate3+Spring2   (2010年5月出版)
     

留言簿(262)

随笔分类

随笔档案

文章分类

相册

关注blog

积分与排名

  • 积分 - 2286196
  • 排名 - 3

最新评论

阅读排行榜

评论排行榜