- 浏览: 203550 次
- 性别:
- 来自: 芜湖
文章分类
- 全部博客 (139)
- 软件 (0)
- Pattern (6)
- CSDN导入 (19)
- Struts (3)
- [网站分类]1.网站首页原创 (27)
- [网站分类]6.转载区 (4)
- Hibernate (10)
- Error (8)
- [网站分类]2.Java新手区 (20)
- Java (8)
- [网站分类]4.其他技术区 (10)
- Web (1)
- C++ (2)
- Algorithm (4)
- Linux (2)
- Skill (1)
- Tech (2)
- Note (2)
- [网站分类]3.非技术区 (1)
- Database (1)
- Winty (7)
- [网站分类]1.网站首页原创Java技术区(对首页文章的要求: 原创、高质量、经过认真思考并精心写作。BlogJava管理团队会对首页的文章进行管理。) (0)
最新评论
-
haohao-xuexi02:
很不错哦。
O'Reilly cos上传组件的使用(1/3) - 上传文件 -
yoin528:
useUnicode=true&charact ...
[原]向MySQL数据库插入Blob数据的问题 -
xiaoqing20:
下载来看看!呵呵
[原]Struts2类型转换 -
xiaoqing20:
[原]Struts2类型转换
[标题]:[原]Struts2-深入探索
[时间]:2009-8-26
[摘要]:Struts2中一些零碎的知识点:struts.xml详解、模型驱动、Preparable接口、防止表单重复提交、ActionContext、动态方法调用、异常
[关键字]:浪曦视频,Struts2应用开发系列,WebWork,Apache,深入探索
[环境]:struts-2.1.6、JDK6、MyEclipse7、Tomcat6
[作者]:Winty (wintys@gmail.com) http://www.blogjava.net/wintys
[正文]:
1、struts.xml详解
a. struts.properties
在struts.xml中可以定义constant覆盖struts-core.jar/org/apache/struts2/default.properties中的设置。
例:<constant name="struts.custom.i18n.resources" value="message"/>
也可以直接新建struts.properties
(与struts.xml在同一目录),在struts.properties中配置。推荐在struts.properties中进行配置。
例:struts.custom.i18n.resources = message
b. abstract package
struts-core.jar/struts-default.xml,中有如下定义。
<package name="struts-default" abstract="true"
>
......
</package>
其中abstract="true"中,表示在此package中不能定义Action(与Java abstract类相似),仅供继承。
c. namespace
strut.xml中:
<package name="MyStruts" extends="struts-default" namespace
="/
mystruts">
......
</package>
默认命名空间为namespace="",命名空间要以"/"开头。
JSP访问:<s:form action="miscellaneous" namespace="/mystruts"
>。
不能写成<s:form action="/mystruts/miscellaneous"> ,否则会发生错误:"No configuration found for the specified action: '/mystruts/miscellaneous' in namespace: '/miscellaneous'. Form action defaulting to 'action' attribute's literal value."[2]。
d. 模块化配置
......
<struts>
<include
file="struts1.xml" />
<package ...>
......
</package>
</struts>
include中struts1.xml的编写与struts.xml是类似的。
2、属性驱动与模型驱动
属性驱动:直接在Action中写表单属性。
/StrutsHelloWorld/src/wintys/struts2/miscellaneous/MiscellaneousAction.java:
import com.opensymphony.xwork2.ActionSupport;
/**
*
* @author Winty (wintys@gmail.com)
* @version 2009-8-24
* @see http://wintys.blogjava.net
*/
@SuppressWarnings("serial")
public class MiscellaneousAction extends ActionSupport {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
模型驱动:将属性放到JavaBean中,Action需要实现com.opensymphony.xwork2.ModelDriven接口。ModelDrivenInterceptor 必须在之前StaticParametersInterceptor and ParametersInterceptor。这个顺序已在defaultStack Interceptor中定义。
/StrutsHelloWorld/src/wintys/struts2/miscellaneous/User.java:
/**
* 模型驱动Action中的模型
* @author Winty (wintys@gmail.com)
* @version 2009-8-25
* @see http://wintys.blogjava.net
*/
public class User {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
/StrutsHelloWorld/src/wintys/struts2/miscellaneous/MiscellaneousModelDrivenAction.java:
import com.opensymphony.xwork2.ModelDriven;
@SuppressWarnings("serial")
public class MiscellaneousModelDrivenAction extends ActionSupport implements
ModelDriven<User>{
private User user = new User();
@Override
public User getModel() {
return user;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
3、Preparable接口
Action还可以实现com.opensymphony.xwork2.Preparable接口,用于准备Action自己。Preparable中的prepare方法在Action执行其它方法前执行。
4、使用simple 主题时,如何单独格式化Struts错误提示信息
单独显示name字段的fielderror:
<s:param>name</s:param>
</s:fielderror>
5、Struts防止表单重复提交
JSP页面中加入token和actionerror:
<s:actionerror />
<s:form .../>
<s:token />
</s:form>
token产生的actionerror的i18n key为:struts.message.invalid.token。
在struts.xml中的Action配置中加入token interceptor,和invalid.token result:
<result name="success">/miscellaneous/output.jsp</result>
<result name="input">/miscellaneous/input.jsp</result>
<result name="invalid.token " >/miscellaneous/input.jsp</result>
<interceptor-ref name="token " />
<interceptor-ref name="defaultStack" />
</action>
生成的JSP页面如下:
<input type="hidden" name="struts.token.name" value="struts.token
" />
<input type="hidden" name="struts.token
" value="ORU0RZIP8JWQ7BDZG4P1NJSEKITGG6X5" />
struts.token.name指<s:token />中的name,默认为struts.token。也可以自己指定<s:token name="mytoken" />。则生成如下token:
<input type="hidden" name="struts.token.name" value="mytoken" />
<input type="hidden" name="mytoken" value="GFD13EW206G2DY9AB3SRIAVXXT1S915C" />
6、通过Struts获取Servlet API
一般Java Web程序不能离开容器进行测试。容器内测试常用框架:Cactus(jakarta.apache.org/cactus/index.html) 、Mock。
通过Struts获取Servlet API,使程序可脱离容器测试。Struts中可通过如下方法获取Servlet API:ActionContext 、ServletActionContext、ServletXXXAware。首选ActionContext,其次选择ServletActionContext,再次ServletXXXAware。
a. ActionContext
com.opensymphony.xwork2.ActionContext.getActionContext()获取ActionContext实例。
ActionContext的get()和put()方法与HttpServletRequest的对应关系:
ActionContext.get() <=> HttpServletRequest.getAttribute()
ActionContext.put() <=> HttpServletRequest.setAttribute()
例:
context.put("info", "this is ActionContext value");
但是ActionContext无法获取Servlet HttpResponse对象。
b. ServletActionContext
org.apache.struts2.ServletActionContext是com.opensymphony.xwork2.ActionContext的子类。
使用静态方法直接获取Servlet对象:
Request: ServletActionContext.getRequest();
Response: ServletActionContext.getResponse();
Session: ServletActionContext.getRequest().getSession();
例:
HttpServletResponse response = ServletActionContext.getResponse() ;
response.addCookie(cookie);
c. ServletXXXAware接口
org.apache.struts2.util.ServletContextAware接口
org.apache.struts2.interceptor.ServletRequestAware接口
org.apache.struts2.interceptor.ServletResponseAware接口
org.apache.struts2.interceptor.SessionAware接口
实现ServletXXXAware接口的Action会被Struts自动注入相应的Servlet对象。
例:
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public class MiscellaneousModelDrivenAction extends ActionSupport implements
ServletRequestAware {
private HttpServletRequest request;
......
@Override
public String execute() throws Exception {
//实现ServletRequestAware接口,Struts自动注入的request
Cookie[] cookies = this.request.getCookies();
for(Cookie ck : cookies){
System.out.print("cookie:" + ck.getName());
System.out.println(" = " + ck.getValue());
}
return SUCCESS;
}
......
@Override
public void setServletRequest (HttpServletRequest request) {
this.request = request;
}
}
7、动态方法调用
a. Action配置中,由method指定动态调用方法的名称。
<action name="myaction" class="com.tests.MyAction" method="myexecute
">
......
</action>
b.在JSP页面中,调用Action时加感叹号指定动态调用方法的名称。
<s:form action="myaction!myexecute
" />
c.通配符
<action name="*action
" class="com.tests.MyAction" method="{1}
">
则请求中helloaction对应到action中的hello()方法,以此类推。
8、异常
发生异常时,可转到指定的result。由exception-mapping配置
<result name="success">/miscellaneous/output.jsp</result>
<result name="input">/miscellaneous/input.jsp</result>
<exception-mapping exception="wintys.struts2.miscellaneous.NameInvalidException" result="nameInvalid" />
<result name="nameInvalid">/miscellaneous/nameInvalidException.jsp</result>
</action>
也可以配置全局exception mapping
<exception-mapping result="nameInvalid" />
</global-exception-mapping>
nameInvalidException.jsp:
<s:property value="exceptionStack" />
NameInvalidException.java:
@SuppressWarnings("serial")
public class NameInvalidException extends Exception {
public NameInvalidException(String message) {
super(message);
}
}
9、详细代码
/StrutsHelloWorld/WebRoot/miscellaneous/input.jsp:
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Input</title>
</head>
<body>
<s:actionerror/>
<s:form action="miscellaneous" method="post" theme="simple" namespace="/mystruts">
<s:token name="mytoken"/>
用户名:<s:textfield name="name" />
<s:fielderror >
<s:param>name</s:param>
</s:fielderror>
<br />
密码:<s:textfield name="password"/>
<s:fielderror >
<s:param>password</s:param>
</s:fielderror>
<br />
<s:submit name="提 交" />
</s:form>
<hr />
动态方法调用方法二: miscellaneous!myexecute
<s:form action="miscellaneous!myexecute" namespace="/mystruts">
<s:token name="mytoken"/>
<s:hidden name="name" value="test" />
<s:hidden name="password" value="test" />
<s:submit name="提交执行myexecute() " />
</s:form>
</body>
</html>
/StrutsHelloWorld/WebRoot/miscellaneous/output.jsp:
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Output</title>
</head>
<body>
提交结果:<br/>
用户名:<s:property value="name"/> <br />
密码:<s:property value="password"/> <br />
<hr />
${request.info}
${cookie.mycookie.value }
</body>
</html>
/StrutsHelloWorld/src/wintys/struts2/miscellaneous/MiscellaneousModelDrivenAction.java:
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
* Struts2深入探索
* @author Winty (wintys@gmail.com)
* @version 2009-8-26
* @see http://wintys.blogjava.net
*/
@SuppressWarnings("serial")
public class MiscellaneousModelDrivenAction extends ActionSupport implements
ModelDriven<User> , ServletRequestAware {
private User user = new User();
private HttpServletRequest request;
@Override
public User getModel() {
return user;
}
@Override
public String execute() throws Exception {
System.out.println("this is model driven action");
if(user.getName().equals("admin")){
throw new NameInvalidException("name 'admin' is invalid");
}
//ActionContext.put相当于HttpServletRequest.setAttribute()
ActionContext context = ActionContext.getContext();
context.put("info", "this is ActionContext value");
//ServletActionContext.getResponse得到Response对象
Cookie cookie = new Cookie("mycookie" , "10000");
HttpServletResponse response = ServletActionContext.getResponse();
response.addCookie(cookie);
//实现ServletRequestAware接口,Struts自动注入的request
Cookie[] cookies = this.request.getCookies();
for(Cookie ck : cookies){
System.out.print("cookie:" + ck.getName());
System.out.println(" = " + ck.getValue());
}
return SUCCESS;
}
public String myexecute()throws Exception{
System.out.println("myexecute()");
return SUCCESS;
}
@Override
public void validate() {
if(user.getName() == null || user.getName().equals("")){
this.addFieldError("name", "invalid name");
}
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
}
/src/struts.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="MyStruts" extends="struts-default" namespace="/mystruts">
<!-- Struts2深入探索 -->
<action name="miscellaneous" class="wintys.struts2.miscellaneous.MiscellaneousModelDrivenAction">
<result name="success">/miscellaneous/output.jsp</result>
<result name="input">/miscellaneous/input.jsp</result>
<exception-mapping exception="wintys.struts2.miscellaneous.NameInvalidException" result="nameInvalid" />
<result name="nameInvalid">/miscellaneous/nameInvalidException.jsp</result>
<result name="invalid.token" >/miscellaneous/input.jsp</result>
<interceptor-ref name="token" />
<interceptor-ref name="defaultStack" />
</action>
</package>
</struts>
[参考资料]:
[1]《浪曦视频之Struts2应用开发系列》
[2] No configuration found for the specified action : http://javasunnyboy.iteye.com/blog/254753
[附件]:
源代码 :
struts_miscellaneous.zip
- struts_miscellaneous.zip (6.3 KB)
- 下载次数: 4
发表评论
-
[原]MyEclipse location already exists
2009-07-27 00:37 1747[标题]:[原]MyEclipse location alre ... -
[原]Exception starting filter MyStruts2
2009-07-27 19:41 1067[标题]:[原]Exception starting filt ... -
[原]Struts2校验框架
2009-07-27 23:54 1141[标题]:[原]Struts2校验框架 [时间]:2009- ... -
[原]Struts2-拦截器
2009-08-01 00:21 1170[标题]:[原]Struts2-拦截器 [时间]:2009- ... -
[原]Struts2-文件上传与下载
2009-08-08 08:48 2207[标题]:[原]Struts2-文件上 ... -
[原]Struts2-国际化
2009-08-10 18:13 1914[标题]:[原]Struts2-国际化 [时间]:2009- ... -
[原]Struts2-整合JFreeChart
2009-09-03 17:10 1925[标题]:[原]Struts2-整合JFr ... -
[转]Java 小例子:数据持久化(保存数据到文件)
2009-03-16 11:00 1784说数据持久化,初学者可能还不太懂;但要说把数据保存到文件,这谁 ... -
[原]调试EL函数时,Tomcat提示NullPointerException
2009-04-03 19:02 944[标题]:调试EL函数时,Tomcat提示NullPointe ... -
[原]HelloWorldServlet
2009-05-27 22:16 950编译运行步骤: 1、将HelloWorldServlet.ja ... -
[原]getServletInfo()
2009-05-27 23:16 1405《JSP完全学习手册》学习心得之:getServletInfo ... -
[原]jsp:forward
2009-05-27 23:24 934《JSP完全学习手册》学习心得:jsp:forward Jud ... -
[原]jsp:param
2009-05-27 23:27 1620《JSP完全学习手册》学习心得:jsp:param param ... -
[原]request.getParameterValues()
2009-05-27 23:32 1243《JSP完全学习手册》学习心得:request.getPara ... -
[原]隐含对象config
2009-05-27 23:54 770《JSP完全学习手册》学习心得:隐含对象config < ... -
[原]cookie读写
2009-05-28 00:03 869《JSP完全学习手册》学习心得:cookie读写 <%@ ... -
[原]getHttpHeader
2009-05-28 00:14 861《JSP完全学习手册》学习心得:getHttpHeader g ... -
[原]向MySQL数据库插入Blob数据的问题
2009-06-03 23:45 3999[标题]:向MySQL数据库插 ... -
[原]SQL内外连接
2009-06-17 22:31 931-- Author:Winty(天堂露珠) -- Date: ...
相关推荐
- **书籍概述**:《Struts2 In Action》是一本深入介绍Struts2框架的著作,由Donald Brown、Chad Michael Davis和Scott Stanlick共同编写。本书通过详实的案例分析与实践指导,帮助读者全面掌握Struts2这一现代Web...
通过深入研究这个源代码,开发者可以更好地理解Struts的工作原理,学习如何构建基于MVC架构的Java Web应用,以及如何利用Struts提供的特性来优化应用的开发和维护。同时,对于希望进一步探索其他MVC框架(如Spring ...
《中南大学软件学院架构:JPetStore的Struts2重构探索》 在现代软件工程领域,架构设计是至关重要的一步,它决定了系统的可扩展性、可维护性和性能。中南大学软件学院的一个实践项目,就是对经典的JPetStore应用...
- Struts2+Spring+Hibernate集成开发。 - 实战项目案例分析。 - **SpringMVC视频教程** - SpringMVC框架入门。 - 控制器设计模式。 - 视图解析与拦截器。 - **JPA视频教程** - JPA规范介绍。 - 实体管理与...
SSH企业级框架精简版本是基于Spring、Struts2和Hibernate这三个开源框架的集成,它在企业级开发中被广泛使用,特别是在Java后端开发领域。这个精简版的SSH框架去除了不必要的复杂性,更适合初学者快速理解和实践。在...
《深入理解JavaWeb开发技术 探索基于主流框架的最佳组合》是谭贞军撰写的一本专业书籍,专注于JavaWeb开发的深度解析与实践。这本书详细介绍了如何在JavaWeb开发中运用主流框架,以达到最佳的技术组合,从而提高开发...
下面,我们将深入探讨 Liferay Portal 的一些关键知识点。 1. **Liferay Portal 概述**: - Liferay Portal 是基于 Java 的,它遵循 JSR-168 和 JSR-286 规范,支持portlet 开发。 - Liferay 提供了完整的用户...
然而,Struts1已经较为老旧,现在更推荐使用Struts2。 Hibernate是一个流行的Java ORM(对象关系映射)框架,它允许开发者用面向对象的方式操作数据库。通过Hibernate,开发者可以避免编写大量的SQL语句,提高开发...
3. **JAVA2核心技术卷I:基础知识(原书第7版)** - 作者:Cay Horstmann - 该书分为两卷,本卷主要关注Java的基本概念和技术,是Java学习者的必备参考资料。 4. **JAVA2核心技术卷II:高级特性(原书第7版)** ...
- 《Java 2核心技术卷 I:基础知识(原书第7版)》和《Java 2核心技术卷 II:高级特性(原书第7版)》:Cay Horstmann的书,涵盖了Java SE的各个方面。 - 《Effective Java 中文版》:Joshua Bloch的著作,提供了...
- **深度探索 C++对象模型**:Stanley B.Lippman的书,深入解析了C++的对象模型。 - **Essential C++中文版**:Scott Meyers的书,简洁明了地介绍了C++的关键特性。 - **Effective C++中文版 2nd Edition**和**...
- **《JAVA 2核心技术 卷I:基础知识(原书第7版)》**和**《JAVA 2核心技术 卷II:高级特性(原书第7版)》**:Cay Horstmann的作品,全面覆盖了Java的各个方面。 - **《Effective Java 中文版》**:Joshua Bloch...
### 计算机经典书籍介绍 #### 一、为何要学编程? 学习编程的原因多种多样,根据个人的目标和兴趣有所不同。...通过阅读这些书籍,不仅能够快速入门,还能够在特定领域深入探索,不断提升自己的编程技能。
### JAVA常用技术下载:深入解析关键技术栈 #### Struts、Spring与Hibernate——JAVA开发的核心框架 在JAVA领域,Struts、Spring与Hibernate是被广泛推崇的技术组合,它们各自扮演着不同的角色,共同支撑起了现代...
│ Java面试题48.struts2的执行流程或者struts2的原理.mp4 │ Java面试题49.Struts2的拦截器是什么?你都用它干什么?.mp4 │ Java面试题50.Spring MVC的执行流程.mp4 │ Java面试题51.SpringMVC和Struts2的不同.mp4...
- **Struts2**、**Hibernate** 和 **Spring** 是 Java 开发中非常流行的三大框架。它们分别专注于 MVC 架构、对象关系映射以及企业级应用开发。 - **DRP**(分销资源规划)项目的视频资料则提供了一个具体的应用...