说明:本文经过笔者对struts 2.0.8 自带的实例struts2-blank-2.0.8学习而写,对该例子进行了部分修改,希望对广大象要学习struts2的朋友有所帮助。
一. 实例说明
本例是Struts2的简单实例,通过本工程的学习,我们将会对struts2的表单以及表单验证有一个初步的认识、了解struts2的配置以及初探Struts2的本地化输出。
二. 编码准备
1. 包的引入
在MyEclipse或NetBeans中建立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的内容,为其增加struts2的FilterDispatcher,修改后的web.xml的内容如下:
< 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.jsp和Login.jsp的编写
首先我们建立 Welcome.jsp ,该文件包含两个链接,点击“登录”链接后跳转到登录信息输入页面,点击“注册”按钮跳转到注册页,为了学习 struts2 配置中的通配符使用,我们暂不实现注册功能。 Welcome.jsp 的代码如下:<% @ 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 >< a href ="<s:url value=" /example/Login.jsp" /> ">登录 </ a ></ li >
< li >< a href ="<s:url action=" Register" /> ">注册 </ a ></ li >
</ ul >
</ body >
</ html >
在该页面的顶部,我们需要将struts2的标签库引入,语句为:<%@ taglib prefix="s" uri="/struts-tags" %>
在该页面,主要用到struts2的<s:url>标签,该页面主要用到该标签的两个属性,分别为value和action,其中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的内容如下:
<% @ 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,该标签最终将生成HTML的form;
<s:textfield>标签类同于HTML的<input type=”text” …>,其中name表示属性域的名称,label表示其前的提示名;
<s:password>标签类同于HTML的<input type=”password” …>,其name和label类同于<s:textfield>,在此略。
2. 配置文件struts.xml和example.xml
在上述 jsp 页面,我们需跳转到两个 Action 地址,需在 struts2 的配置文件中配置,因当工程变大时,一个庞大的 struts2 的配置极难维护,建议按包路径分开配置文件,所以本实例除了 struts.xml 配置文件外,还新增了一个额外的配置文件 example.xml 。该文件在 struts.xml 中引用。 struts.xml 放在 src 目录下,该文件的内容如下:<! 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的配置:
<! 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" method ="{1}" 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. Login和ExampleSupport类以及验证配置类Login-validation.xml的编写
在配置文件example.xml中,定义了两个Action,下面我们用代码来实现这两个Action
首先让我们来看看ExampleSupport这个Action,这个Action不做任何操作,集成自ActionSupport,是本工程的各Action类的基类,该类的代码如下:
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中的username和password属性增加非空验证,验证配置如下:
"-//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/u4e 3a /u 7a 7a .
password = /u5bc6/u7801
username = /u7528/u6237/u540d
Missing.message = /u8be5/u90e8/u5206/u 5c 1a /u 672a /u6784/u5efa/uff 0c /u8bf7/u 7a 0d/u5019/u8bbf/u95ee...
5. Register.jsp和Missing.jsp的编写
在2中的example.xml中,我们配置了通配符映射,在Welcome.jsp中,我们使用
<a href="<s:url action="Register"/>">注册</a>
其中的Register在example中找不到相关映射,于是在用户点击“注册”按钮时,将映射到通配符所映射的Action:example. ExampleSupport.而后跳转到Register.jsp页面,其代码如下:<% @ taglib prefix="s" uri="/struts-tags" %>
< s:include value ="Missing.jsp" />
该页面包含Missing.jsp页面,其代码如下:
<% @ 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. 本地化输出错误提示信息
在验证失败时,用资源文件来输出错误提示信息。
4.Strut2配置文件中通配符的使用
对于某些地址,我们可以使用在struts2的配置通配符来使其映射到某个Action中去。
本文通过构建一个简单的Struts2实例,介绍了表单及其验证、配置文件、本地化输出及通配符使用等内容。
——struts2-blank-2.0.8实例学习&spm=1001.2101.3001.5002&articleId=2071559&d=1&t=3&u=891753abbf254010a4b3086b2d3b3cb4)
498

被折叠的 条评论
为什么被折叠?



