- 浏览: 149169 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
hekuilove:
楼主 介意把你的代码放到//代码 里么
JPA一对多,多对多映射 -
308202251:
[size=medium][/size][align=cent ...
usionCharts中文乱码问题 -
勇敢的核桃:
我日,从传~智~播~客上听来的东西原封不动的就转了。。人才!但 ...
搭建JPA开发环境和全局事务介绍 -
w156445045:
怎么使用啊?和log4j一样 写个配置文件还是?
谢谢~
slf4j-1.6.1.zip -
JavaStudyEye:
啥也不说了 很详细,谢谢分享,太好了
Struts2 + JQuery + Json 实例
一.Struts2概述
众所周知,Struts2是以Webwork2作为基础发展出来,WebWork是一个强大的基于Web的MVC框架, 它构建在一个命令模式框架XWork之上。
WebWork真正的优势在于它强调简洁和协作能力的根本理念. 使用WebWork将有助于最小化代码并允许开发人员更多的关注业务逻辑和建模而不是诸如编写Servlet之类的事情。
Struts2和webwork2基本上一样的,核心基本没改,部分包名进行了修改。Struts2对webwork的改进之处如下:
1. webwork.properties文件中变量现在可以配置在下列文件:
struts-default.xml
struts-plugin.xml(在每个plugin的jar包中)
struts.xml(用constant元素)
struts.properties(没有默认文件,可选,与webwork.properties文件相似,每个项目可以有这个文件)W
web.xml
2.Struts2的配置文件加入了对通配符的支持。
二.Struts1与Struts2的对比
根据Struts2开发组的文章可以得知,Struts2与Struts1的不同之处如下表所示:
不同点 Struts1 Struts2
Action 类 要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现 常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。
线程模式 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
Servlet 依赖 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。
可测性 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。
捕获输入 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经 常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存 在的JavaBean(仍然会导致有冗余的javabean)。 直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。
表达式语言 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。 可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL).
绑定值到页面(view) 使用标准JSP机制把对象绑定到页面中来访问 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
类型转换 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。 使用OGNL进行类型转换。提供基本和常用对象的转换器。
校验 支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。 支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性
Action执行的控制 支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。 支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。
1
三.Struts2实例
下面我们通过实例来学习一下Struts2的使用。通过本实例的学习,我们将会对struts2的表单以及表单验证有一个初步的认识、了解struts2的配置以及初探Struts2的本地化输出。
1.实例说明
本例是Struts2的简单实例,通过本工程的学习,我们将会对struts2的表单以及表单验证有一个初步的认识、了解struts2的配置以及初探Struts2的本地化输出。
2. 编码准备
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的内容如下:
<?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文件。
3. 编码
1) Welcome.jsp和Login.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:urlvalue="/css/examplecss"/>"rel="stylesheet" type="text/css"/>
</head>
<body>
<h3>导航</h3>
<ul>
<li><a href="<s:urlvalue="/example/Login.jsp"/>">登录</a></li>
<li><a href="<s:urlaction="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的内容如下:
<%@ 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,该标签最终将生成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目录下,该文件的内容如下:
<?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" 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类的基类,该类的代码如下:
package example;
import com.opensymphony.xwork2.ActionSupport;
publicclass ExampleSupport extends ActionSupport {
}
接着让我们来看看Login这个Action,该类继承自ExampleSupport类,该Action需实现的业务逻辑如下:
a) 当用户名(username)或密码(password)有一者或两者为空时,登录不成功,跳转到登录信息输入页面;
b) 当用户名(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属性增加非空验证,验证配置如下:
<!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.jsp和Missing.jsp的编写
在2中的example.xml中,我们配置了通配符映射,在Welcome.jsp中,我们使用
<a href="<s:url action="Register"/>">注册</a>
其中的Register在example中找不到相关映射,于是在用户点击“注册”按钮时,将映射到通配符所映射的Action:example. 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看到我们的劳动成果。下面总结一下我们在该实例中学到的东西。
常用的一些标签的使用
在本实例中,我们学习了<s:textfield>、<s:password>、<s:form>以及<s:url>的使用。
表单数据的验证
本文描述了一个简单的表单的数据非空验证。
3. 本地化输出错误提示信息
在验证失败时,用资源文件来输出错误提示信息。
4.Strut2配置文件中通配符的使用
对于某些地址,我们可以使用在struts2的配置通配符来使其映射到某个Action中去。
众所周知,Struts2是以Webwork2作为基础发展出来,WebWork是一个强大的基于Web的MVC框架, 它构建在一个命令模式框架XWork之上。
WebWork真正的优势在于它强调简洁和协作能力的根本理念. 使用WebWork将有助于最小化代码并允许开发人员更多的关注业务逻辑和建模而不是诸如编写Servlet之类的事情。
Struts2和webwork2基本上一样的,核心基本没改,部分包名进行了修改。Struts2对webwork的改进之处如下:
1. webwork.properties文件中变量现在可以配置在下列文件:
struts-default.xml
struts-plugin.xml(在每个plugin的jar包中)
struts.xml(用constant元素)
struts.properties(没有默认文件,可选,与webwork.properties文件相似,每个项目可以有这个文件)W
web.xml
2.Struts2的配置文件加入了对通配符的支持。
二.Struts1与Struts2的对比
根据Struts2开发组的文章可以得知,Struts2与Struts1的不同之处如下表所示:
不同点 Struts1 Struts2
Action 类 要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现 常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。
线程模式 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
Servlet 依赖 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。
可测性 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。
捕获输入 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经 常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存 在的JavaBean(仍然会导致有冗余的javabean)。 直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。
表达式语言 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。 可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL).
绑定值到页面(view) 使用标准JSP机制把对象绑定到页面中来访问 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
类型转换 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。 使用OGNL进行类型转换。提供基本和常用对象的转换器。
校验 支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。 支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性
Action执行的控制 支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。 支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。
1
三.Struts2实例
下面我们通过实例来学习一下Struts2的使用。通过本实例的学习,我们将会对struts2的表单以及表单验证有一个初步的认识、了解struts2的配置以及初探Struts2的本地化输出。
1.实例说明
本例是Struts2的简单实例,通过本工程的学习,我们将会对struts2的表单以及表单验证有一个初步的认识、了解struts2的配置以及初探Struts2的本地化输出。
2. 编码准备
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的内容如下:
<?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文件。
3. 编码
1) Welcome.jsp和Login.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:urlvalue="/css/examplecss"/>"rel="stylesheet" type="text/css"/>
</head>
<body>
<h3>导航</h3>
<ul>
<li><a href="<s:urlvalue="/example/Login.jsp"/>">登录</a></li>
<li><a href="<s:urlaction="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的内容如下:
<%@ 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,该标签最终将生成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目录下,该文件的内容如下:
<?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" 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类的基类,该类的代码如下:
package example;
import com.opensymphony.xwork2.ActionSupport;
publicclass ExampleSupport extends ActionSupport {
}
接着让我们来看看Login这个Action,该类继承自ExampleSupport类,该Action需实现的业务逻辑如下:
a) 当用户名(username)或密码(password)有一者或两者为空时,登录不成功,跳转到登录信息输入页面;
b) 当用户名(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属性增加非空验证,验证配置如下:
<!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.jsp和Missing.jsp的编写
在2中的example.xml中,我们配置了通配符映射,在Welcome.jsp中,我们使用
<a href="<s:url action="Register"/>">注册</a>
其中的Register在example中找不到相关映射,于是在用户点击“注册”按钮时,将映射到通配符所映射的Action:example. 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看到我们的劳动成果。下面总结一下我们在该实例中学到的东西。
常用的一些标签的使用
在本实例中,我们学习了<s:textfield>、<s:password>、<s:form>以及<s:url>的使用。
表单数据的验证
本文描述了一个简单的表单的数据非空验证。
3. 本地化输出错误提示信息
在验证失败时,用资源文件来输出错误提示信息。
4.Strut2配置文件中通配符的使用
对于某些地址,我们可以使用在struts2的配置通配符来使其映射到某个Action中去。
发表评论
-
appfuse 安装笔记
2011-06-11 21:27 1996环境是maven 2.2.1 我 ... -
java.lang.ClassCastException:org.apache.catalina.util.DefaultAnnotationProcessor
2011-05-11 22:35 1417org.apache.jasper.JasperExcepti ... -
ValueStack
2011-04-28 09:33 4092在struts2中没有与servlet ... -
java中HashSet详解
2011-04-27 23:54 877HashSet 的实现 对于 HashSet 而言,它是基于 ... -
valuestack的工作原理(转)
2011-04-27 17:12 1212当访问一个action的时候,此时struts2会把整个act ... -
Struts 2杂谈(1):ValueStack对象的传送带机制
2011-04-27 10:57 815众所周知,Strut 2的Act ... -
Struts in Action读书笔记
2011-04-12 22:59 2282转自 http://blog.csdn.net/Jiangc ... -
struts2中请求action错误与jsp请求错误处理
2011-02-18 16:05 1709在struts2中,若请求的XXX.action不存 ... -
在MyEclipse中安装Freemarker插件
2011-01-13 10:43 1160<转>在MyEclipse中安装Freemarke ... -
Struts2提交数组
2011-01-10 18:17 4675webwork表单提交中有一个很有用的技巧,在提交成组的类似p ... -
Struts2 类型转换 Type Convertion (转载)
2011-01-10 18:01 953HTTP协议中传递的任何内 ... -
struts2 xml 验证出现 Invalid field value for field 的解决方法(转)
2011-01-10 13:07 1359缺省情况下, 所有的装换错误使用通用的i18n信息 xwork ... -
Struts2 类型转换 Type Convertion (转载)
2011-01-10 10:02 808为什么会有类型转换? HTTP协议中传递的任何内容都是Stri ... -
Struts2使用拦截器完成权限控制示例
2011-01-06 23:01 1012示例需求: 要求用户登录,且必须为指定用户名才可以查看系 ... -
Struts2 访问request、session和application对象
2010-12-31 11:38 1176在传统的Web开发中,经常会用到Servlet API中的Ht ... -
关于tomcat6.0 连接池 和myeclipse内置tomcat连接池的建立
2010-12-28 16:43 18521 下载Tomcat最新版本 下载地址:http://tomc ... -
java Struts2使用拦截器完成权限控制示例
2010-12-24 18:09 959Struts2使用拦截器完成权限控制示例 关键字: strut ... -
struts2 权限控制拦截器
2010-12-24 17:56 11441 实现权限控制拦截器 ... -
struts2 标签使用异常 The Struts dispatcher cannot be found.
2010-12-17 13:52 1302struts2 标签使用异常 The Struts disp ... -
调式struts时候遇到的问题总结
2010-12-17 13:52 10402010-12-17 14:04:23 com.opensym ...
相关推荐
### Struts框架详解 #### 一、框架的概念与重要性 框架(Framework)是指一种预先设计好的、可重用的半完成程序结构,主要用于构建特定类型的定制化应用程序。框架的设计目的是提高开发效率并促进代码复用。在软件...
Struts2是一个强大的Java EE应用程序框架,主要用于构建Web应用程序。这个“struts2学习资料”压缩包包含了丰富的学习资源,适合初学者系统性地掌握Struts2的核心概念和技术。以下是一些关键知识点的详细说明: 1. ...
6. **Struts2标签库**:Struts2提供了一系列自定义的JSP标签,如`s:form`、`s:textfield`、`s:submit`等,简化了视图层的开发。 7. **FilterDispatcher**:Struts2的前端控制器,它监听特定的HTTP请求,根据配置...
Struts2是一个基于MVC(Model-View-Controller)设计模式的开源JavaEE框架,用于构建企业级Web应用程序。它提供了强大的控制层,使得开发者能够更有效地管理请求、响应以及应用逻辑。Struts2的核心是Action类,它...
2. **解析请求参数**:ActionServlet会解析请求中的参数,包括确定请求的Action名称。 3. **查找Action映射**:根据请求中的Action名称,在配置文件中查找对应的Action映射。 4. **创建ActionForm**:如果请求中有...
Struts2是一个强大的MVC(Model-View-Controller)框架,用于开发Java EE的Web应用程序。它在企业级Java应用开发中被广泛使用,尤其是在建立动态Web页面方面。作为一个基于WebWork核心的框架,Struts2在许多方面对...
此为MyEclipse下Struts2的配置使用文档,附件包括配置步骤文档及源码,文档为本人学习struts2配置一步一步所写,完全为个人对struts2的学习理解,如有不正确的地方,请留言批评指正,谢谢!附件包含项目源码,为本人...
Struts2 Struts2 Struts2 教程 1 1 1 :第一个 Struts2 Struts2 Struts2 程序 在本系列教程中我们将学习到 Struts2 的各种技术。在本教程中使用的工具和程序库的版本 如下: 开发工具: MyEclipse6 Web 服务器: ...
总的来说,"STRUTS2学习实例5"是学习和掌握Struts2框架的关键一步,通过实践,开发者可以更好地运用Struts2来构建高效、稳定的Java Web应用程序。在学习过程中,不仅需要理解框架的基本概念,还要学会如何根据需求...
对于希望入门Java Web开发的学习者来说,掌握Struts2框架的使用是基础且关键的一步。通过阅读官方文档、学习示例程序、了解各配置文件的作用以及实际编写案例代码,能够帮助学习者快速进入Java Web开发的大门。
### STRUTS2学习系列:理解与应用 #### 引言 Struts作为MVC(Model-View-Controller)架构模式的代表性Web框架之一,自从其问世以来,便以其清晰的架构设计、丰富的标签库以及开源特性,赢得了广大开发者的心。...
对于初学者,理解并熟练掌握Struts1 API是迈向专业Java Web开发的重要一步。下面我们将深入探讨Struts1的核心概念、主要组件以及API的使用。 一、Struts1核心概念 1. Action:这是Struts1的核心类,它是处理用户...
Struts2是一个强大的Java web框架,它极大地简化了MVC(模型-视图-控制器)应用的开发。在Struts2框架中,标签库是其重要组成部分,它提供...对于Java web开发者来说,掌握Struts2标签的API是提升开发效率的关键一步。
### Struts2 入门学习知识点详解 #### 一、Struts2 概念与背景 **Struts2** 是一款流行的 Java Web 开发框架,它继承了 **Struts1** 和 **WebWork** 的技术基础,并在此基础上进行了创新和发展。作为 **Struts** ...
Struts2是一个强大的MVC(Model-View-Controller)框架,它是Apache软件基金会下的一个开源项目,被广泛用于Java Web应用程序的开发。该框架的主要目标是简化开发过程,提高代码的可维护性和可测试性。这里我们将...