- 浏览: 388492 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
zenmshuo:
这个也是调用Excel IO实现的吗?之前都是通过Spread ...
JS 导入导出 EXcel -
todayANDtommorow:
太喜欢了,谢谢
HSSFWorkBooK用法 -
qinjian379:
挺实用的。
HSSFWorkBooK用法 -
s_8808:
var isMobile=/^(?:13\d|15\d)\d{ ...
正则表达式判断电话号码 -
liuweihug:
jquery调用函数时传递对象参数 http://www.s ...
Jquery 迭代对象
Struts2中一些零碎的知识点:struts.xml详解、模型驱动、Preparable接口、防止表单重复提交、ActionContext、动态方法调用、异常
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:
package wintys.struts2.miscellaneous; 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:
package wintys.struts2.miscellaneous; /** * 模型驱动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:
package wintys.struts2.miscellaneous; 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: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:
<action name="miscellaneous" class="wintys.struts2.miscellaneous.MiscellaneousModelDrivenAction"> <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()
例:
ActionContext context = ActionContext.getContext(); 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();
例:
Cookie cookie = new Cookie("mycookie" , "10000"); 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对象。
例:
package wintys.struts2.miscellaneous; 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配置
<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> </action>
也可以配置全局exception mapping
<global-exception-mapping> <exception-mapping result="nameInvalid" /> </global-exception-mapping>
nameInvalidException.jsp:
<s:property value="exception"/> <s:property value="exceptionStack" />
NameInvalidException.java:
package wintys.struts2.miscellaneous; @SuppressWarnings("serial") public class NameInvalidException extends Exception { public NameInvalidException(String message) { super(message); } }9、详细代码
/StrutsHelloWorld/WebRoot/miscellaneous/input.jsp:
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> <%@ 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:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ 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:
package wintys.struts2.miscellaneous; 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:
<?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="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.javaeye.com/blog/254753
该篇BOLG 摘自 http://www.blogjava.net/wintys/archive/2009/08/29/struts_helloworld_miscellaneous.html
感谢博主的分享. 觉得很实用就全文摘抄下来了..呵呵~~
发表评论
-
org.apache.commons.digester.Digester 解析 XML文件或者流
2012-07-12 19:21 1971最近在做快捷支付这块,对XML这块接触的比较多.梳理XML这块 ... -
tomcat 启动两次, servlet 初始化两次
2012-02-07 13:52 1571今天有同事碰到了 servlet 的init方法 ... -
java 属性文件读取工具类
2012-02-07 10:30 1184哎 . 年纪大了就越来越懒了... 不废话,直接代码 ... -
HSSFWorkBooK用法
2012-02-02 14:45 109258public ActionResult excel ... -
httpclient 的相关应用
2011-07-21 17:29 23551这个主要是 httpclient4.0.3 的一些常用 ... -
JDBC 取一个结果集得简单处理方法
2011-07-15 15:38 19771:首先可以看下SQL语句 select task.t ... -
判断Socket 服务端是否已关闭
2011-03-28 16:07 2692最近在开发中遇到一个问题,就是如何判断远端服务器是否已经断开连 ... -
Ibatis 调用存储过程 返回值为空 求真相
2011-01-20 11:01 21191: 首先看存储过程语句(我是用Navicat 8) CR ... -
Java基础-关于session的详细解释
2010-11-18 16:44 1197一、术语session 在我的经验里,session这个词 ... -
java中如何实现同一账号不能同时登录
2010-11-18 14:44 20382经过两天的研究,下面给两个方法.不个是webwork版 ... -
Java基础:里设置session过期时间
2010-11-18 09:42 7028由于session值之前没有设置,以至于刚登录的网站,不 ... -
webwork Action中获取request, response,session对象的方法
2010-11-17 16:52 1719webwork Action中获取request, ... -
webwork 获得 request,session
2010-11-15 17:33 885ServletActionContext.getRequ ... -
ActionContext.getContext().getSession() 的意义
2010-11-12 10:16 70541: ActionContext.getContext ... -
java Web 同一个用户名不能同时登陆的思路
2010-11-12 08:55 5995情况之一:第一个用户等陆了,不允许第二个用户登录。 ... -
JSP 访问数据库
2010-10-09 14:48 15231:导入 Java类 <%@ page lan ... -
小知识
2010-08-12 10:28 8491:纯粹就是给自己长记性 <script typ ... -
Java中的时间操作(判断工作日和休息日)和判断日期大小
2010-07-08 14:43 12989--1:日期操作以免自己 ... -
webwork 文件上传
2010-06-08 15:40 1171--1:先看属性 private ... -
java 导出 TXT,CSV
2010-05-06 11:07 5293导出这两个就比导出EXCel简单多了,主要是不用考虑一个一个 ...
相关推荐
在第19讲“Struts2深入探索”中,我们将继续深入理解Struts2的核心特性和工作原理,这包括但不限于配置、拦截器、插件、以及源码分析。以下是关于Struts2的一些关键知识点: 1. **MVC模式**:Struts2遵循Model-View...
在第18讲“Struts2深入探索”中,我们将会探讨Struts2的一些高级特性和深入使用的技巧。这篇学习笔记将主要围绕以下几个核心知识点展开: 1. **拦截器(Interceptors)**: Struts2的核心特性之一是拦截器,它允许...
Struts2 深入探索 Struts2 是一个基于 Model-View-Controller(MVC)设计模式的Java Web框架,它旨在简化开发过程并提供更健壮的控制层。Struts2 结合了WebWork的优秀特性与Struts1的优点,提供了更强大的功能和更...
5. **Struts2深入探索**: 进阶使用Struts2时,可以研究其插件机制、自定义拦截器、国际化支持以及与其他技术(如Spring、Hibernate)的集成。 6. **Struts2标签**: Struts2提供了丰富的标签库,如FreeMarker或...
六、Struts2深入探索 深入理解Struts2的核心源码,有助于掌握其内部工作原理,如ActionInvocation的执行流程,以及拦截器链的处理。 七、Struts2整合 Struts2可以与其他技术无缝集成,如: - **JSF**: 结合Java...
6. **Struts2深入探索**: - **拦截器栈**:通过组合多个拦截器形成拦截器栈,实现特定的功能序列。 - **插件机制**:Struts2的可扩展性,如Tiles插件用于布局管理,Freemarker或Velocity插件用于视图渲染。 7. *...
- **深入源码**:针对某些重要知识点,比如Action的执行流程、拦截器的工作原理等,本教程还会带领学员一起探索源码,加深对框架内部机制的理解。 ### 结语 通过以上对Struts2各个方面的介绍,可以看出Struts2不仅...
让我们深入探讨一下Struts2的基础知识。 1. **MVC架构**: MVC模式是软件设计中的一个经典模式,它将应用逻辑分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。在Struts2中,模型负责业务...
在这个项目中,我们将深入探讨Struts2的关键特性、配置以及它如何协调各个组件来实现业务逻辑和用户界面的分离。 首先,了解Struts2的基础架构至关重要。Struts2的核心是Action类,它是处理用户请求并执行业务逻辑...
这个"struts2 demo project"是为了帮助开发者理解和实践Struts2框架而创建的一个示例项目,旨在提供一个基础的、可运行的实例,让大家能够深入探索Struts2的核心特性和功能。 在Struts2框架中,以下是一些关键知识...
7. **插件与扩展**:探索Struts 2的丰富插件系统,如Tiles、Ajax支持、上传下载等,以及如何编写自己的插件。 8. **异常处理**:学习如何在Struts 2中优雅地处理异常,包括全局和局部的异常映射。 9. **整合其他...
本文将深入探讨Struts2自定义标签的实现机制、优点以及如何在实际项目中进行应用。 一、Struts2自定义标签的概念 自定义标签是JSP的一种扩展,允许开发者创建自己的HTML标签,这些标签可以封装复杂的业务逻辑,使得...
Struts2是一个强大的MVC(模型-视图-控制器)框架,用于构建可维护性和可扩展性极高的Java Web应用程序。...对于初学者来说,了解和实践上述步骤是掌握Struts2框架的第一步,后续可以逐步探索更多高级特性和最佳实践。
总的来说,"Struts2帮助文档"是一份宝贵的资源,它将引导你探索Struts2的强大功能,助你在开发高效、稳定的Web应用时游刃有余。通过深入阅读和实践,你不仅可以掌握Struts2的使用,还能提升Java web开发的整体能力。
在本项目“struts2 helloworld”中,我们将会探索如何在MyEclipse 6.0集成开发环境中,利用JDK 1.6和Tomcat 6.0服务器来搭建一个基本的Struts2应用。 首先,我们需要安装和配置这些必要的工具。MyEclipse 6.0是一个...
Struts2是一个强大的Java web应用程序框架,用于构建和维护可扩展、高效且易于维护的Web应用。这本书"Struts2 In Action"是深入探讨...通过这本书,你可以深入探索Struts2的每一个角落,从而在实际项目中更加得心应手。
Struts2是一个强大的Java web应用程序框架,用于构建和部署可维护、高性能的Web应用程序。...随着对Struts2的深入学习,你还可以探索更高级的主题,如拦截器的自定义、国际化、异常处理等,进一步提升你的Web开发技能。
Struts 2是一款强大的MVC(Model-...深入研究这些例子,将有助于你掌握Struts 2的核心特性和实际应用,为构建高效、可维护的Java Web应用打下坚实基础。在实践中不断探索和学习,你将能更好地理解和运用Struts 2框架。