- 浏览: 98023 次
- 性别:
文章分类
最新评论
-
chinrui:
iamaj2eeprogrammer 写道顶一个 。。。。。。 ...
日志规范 -
iamaj2eeprogrammer:
顶一个 。。。。。。。。。。
日志规范 -
chinrui:
如果Eclipse安装过Android的开发插件,可能会有一定 ...
使用Ant编译生成Hadoop的Eclipse插件
Structs学习笔记
一、建立structs项目的时候需要配置structs.xml以及web.xml文件
web.xml的简单配置(配置filter)
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> structs.xml文件的配置(配置package) <constant name="struts.devMode" value="false" /> <package name="default" namespace="/" extends="struts-default"> <action name="hello_structs"> <result> /Hello.jsp </result> </action> </package>
二、namespace的作用
namespace决定了action的访问路径,默认为"",可以接收所有路径的action
namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action, /xxx/index.action,或者/xxx/yyy/index.action.
namespace最好也用模块来进行命名
三、action的class属性
<package name="front" extends="struts-default" namespace="/"> <action name="index" class="com.bjsxt.struts2.front.action.IndexAction1"> <result name="success">/ActionIntroduction.jsp</result> </action> </package>
当访问到index的时候,会访问IndexAction1的返回值来调用相应的result,返回相应的jsp文件。
而自己定义的Action只是一个普通的java类,里面只要含有public String execute()方法即可。
而实现Action有三种方法:
第一种:写一个普通的java类,里面包含execute()方法
public class IndexAction1 { public String execute() { return "success"; } }
第二种:写一个类实现Action接口,重写execute()方法
public class IndexAction2 implements Action { public String execute() { return "success"; } }
第三种:写一个类继承ActionSupport类,重写execute()方法
public class IndexAction3 extends ActionSupport { public String execute() { return "success"; } }
由于第三种方法实现了Action接口,且里面提供了大量的已经定义好的方法,所以在企业开发的过程中一般选用的第三种方法,前面两种方法可以不记。
四、路径问题
struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。
虽然可以用redirect方式解决,但redirect方式并非必要。
解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径)
或者使用myeclipse经常用的,指定basePath
五、Action的动态方法调用(DMI)
<package name="user" extends="struts-default" namespace="/user"> <action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add"> <result>/user_add_success.jsp</result> </action> <action name="user" class="com.bjsxt.struts2.user.action.UserAction"> <result>/user_add_success.jsp</result> </action> </package>
指定method的时候,调用method指定的方法,如果没有指定method的值,则可以通过在写链接的时候在相应的action后面加上!和方法的名字,进行动态的调用方法,eg: user!add…其中user为action的名字,add为Action的方法。
六、通配符的使用(简化配置)
<package name="actions" extends="struts-default" namespace="/actions"> <action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}"> <result>/Student{1}_success.jsp</result> </action> <action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}"> <result>/{1}_{2}_success.jsp</result> </action> </package>
*表示匹配所有,而{1}和{2}分别表示匹配第一个*和第二个*所匹配的内容。
1、如果将请求的action写成Studentadd,那么{1}处就会指定调用的方法为add(),而action又指定为StudentAction,那么就会调用StudentAction里面的add()方法,返回的jsp文件为Studentadd_success.jsp.
2、如果将请求的action写成Teacher_add,那么{1}处为Teacher,所以调用TeacherAction,{2}处为add,所以调用add()方法,而返回的jsp文件为Teacher_add_success.jsp.
七、action参数的接收
1、通过Action类的成员变量来接收参数,不过必须让调用参数的方法名与参数名进行对应。
struts.xml文件配置
<package name="user" extends="struts-default" namespace="/user"> <action name="user" class="com.bjsxt.struts2.user.action.UserAction"> <result>/user_add_success.jsp</result> </action> </package>
发出请求
<a href="user/user!add?name=aaaa&age=8">添加用户</a>
参数的接收
public class UserAction extends ActionSupport { private String name; private int age; public String add() { System.out.println("name=" + name); System.out.println("age=" + age); return SUCCESS; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
2、使用DomainMode接收参数
struts.xml文件配置
<package name="user" extends="struts-default" namespace="/user"> <action name="user" class="com.bjsxt.struts2.user.action.UserAction"> <result>/user_add_success.jsp</result> </action> </package>
发出请求
<a href="user/user!add?user.name=a&user.age=8">添加用户</a>
参数接收,自己不要实例化Model,stucts会帮你创建
public class UserAction extends ActionSupport { private User user; public String add() { System.out.println("name=" + user.getName()); System.out.println("age=" + user.getAge()); return SUCCESS; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
对象的封装
public class User { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
***当传入的参数与要接收的参数不匹配时,使用DTO接收数据,再使用DTO将数据传给Model对象进行生成初始化Model
3、使用ModelDriven接收参数
struts.xml配置
<package name="user" extends="struts-default" namespace="/user"> <action name="user" class="com.bjsxt.struts2.user.action.UserAction"> <result>/user_add_success.jsp</result> </action> </package>
发出请求
<a href="user/user!add?name=a&age=8">添加用户</a>
Action的写法,Model对象要自己创建,要实例ModelDriven接口,使用getModel()方法返回Model对象
public class UserAction extends ActionSupport implements ModelDriven<User>{ private User user = new User(); public String add() { System.out.println("name=" + user.getName()); System.out.println("age=" + user.getAge()); return SUCCESS; } @Override public User getModel() { return user; } }
八、字符编码(中文)
<constant name="struts.i18n.encoding" value="GBK" /> <!-- internationalization -->
九、获得Web元素
public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware { private Map<String, Object> request; private Map<String, Object> session; private Map<String, Object> application; //DI dependency injection //IoC inverse of control public String execute() { request.put("r1", "r1"); session.put("s1", "s1"); application.put("a1", "a1"); return SUCCESS; } @Override public void setRequest(Map<String, Object> request) { this.request = request; } @Override public void setSession(Map<String, Object> session) { this.session = session; } @Override public void setApplication(Map<String, Object> application) { this.application = application; } }
还有其它三种获得request、session、application及HttpRequest、HttpSession、ServletContext对象的方法。不过实际开发只使用这种而已。
十、Struts里面的文件包含
<struts> <constant name="struts.devMode" value="false" /> <include file="login.xml" /> </struts>
十一、设置默认的action
<default-action-ref name="index"></default-action-ref>
十二、常用的跳转方式
1. dispatcher :forword 到jsp页面
2. redirect :Redirecte 到jsp页面
3. chain :forword 到action
4. redirectAction :Redirect 到action
使用:(注意路径问题,即/的添加)
<action name="r1"> <result type="dispatcher">/r1.jsp</result> </action> <action name="r2"> <result type="redirect">/r2.jsp</result> </action> <action name="r3"> <result type="chain">r1</result> </action> <action name="r4"> <result type="redirectAction">r2</result> </action>
十三、定义全局的action以及extends属性的作用
<struts> <constant name="struts.devMode" value="f" /> <package name="user" namespace="/user" extends="struts-default"> <global-results> <result name="mainpage">/main.jsp</result> </global-results> <action name="index"> <result>/index.jsp</result> </action> <action name="user" class="com.bjsxt.struts2.user.action.UserAction"> <result>/user_success.jsp</result> <result name="error">/user_error.jsp</result> </action> </package> <package name="admin" namespace="/admin" extends="user"> <action name="admin" class="com.bjsxt.struts2.user.action.AdminAction"> <result>/admin.jsp</result> </action> </package> </struts>
十四、动态结果集
访问请求:
<ol> <li><a href="user/user?type=1">返回success</a></li> <li><a href="user/user?type=2">返回error</a></li> </ol>
Action:
public class UserAction extends ActionSupport { private int type; private String r; public String getR() { return r; } public void setR(String r) { this.r = r; } public int getType() { return type; } public void setType(int type) { this.type = type; } @Override public String execute() throws Exception { if(type == 1) r="/user_success.jsp"; else if (type == 2) r="/user_error.jsp"; return "success"; } }
struts.xml的配置:
<action name="user" class="com.bjsxt.struts2.user.action.UserAction"> <result>${r}</result> </action>
重点:使用${}读取ValueStack里面的值,而使用#key读取StackContext里面的值。
十五、向result传参数
访问请求:
<li><a href="user/user?type=1">传参数</a></li>
Action:
public class UserAction extends ActionSupport { private int type; public int getType() { return type; } public void setType(int type) { this.type = type; } @Override public String execute() throws Exception { return "success"; } }
struts.xml的配置:
<package name="user" namespace="/user" extends="struts-default"> <action name="user" class="com.bjsxt.struts2.user.action.UserAction"> <result type="redirect">/user_success.jsp?t=${type}</result> </action> </package>
参数的读取:(由于传递给result的参数没有使用Action接收,所以存放在StackContext里面,使用${}进行读取)
<body> User Success!<br /> from valuestack: <s:property value="t"/><br/> 此方法不能读取出任何值出来 from actioncontext: <s:property value="#parameters.t"/> <s:debug></s:debug> </body>
十六、OGNL表达式(Object Graph Navigation Language)
访问ValueStack里面的静态方法时,需要设置struts.ognl.allowStaticMethodAccess属性为true
- 1、 ValueStack里面的值可以直接读取。eg:<s:property value="username"/> 读取username的值
- 2、 Domain Model 的初始化:Domain Model可以自己通过new()方法来创建,也可以让其自动初始化,不过要传入相应的属性值,而且Domain Model要有参数为空的构造方法。
- 3、 访问值栈对象普通的属性:<s:property value="cat.friend.name"/>
- 4、 访问值栈对象普通的方法:<s:property value="password.length()"/>
- 5、 访问值栈action的普通方法:<s:property value="m()" />
- 6、 访问静态的方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/>
- 7、 访问静态的属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/>
- 8、 访问Math类的静态方法:<s:property value="@@max(2,3)" />
- 9、 访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/>
- 10、 访问List:<s:property value="users"/>
- 11、 访问List中某个元素:<s:property value="users[1]"/>
- 12、 访问List中元素某个属性的集合:<s:property value="users.{age}"/>
- 13、 访问List中元素某个属性的集合中的特定值: <s:property value="users[0].age"/>
- 14、 访问Set中的某个元素:不能实现,因为Set为无序的
- 15、 访问Map中某个元素:<s:property value="dogMap.dog101"/> Map实例的名字加上Key值得到Value
- 16、 访问Map中所有的key:<s:property value="dogMap.keys"/>
- 17、 访问Map中所有的value:<s:property value="dogMap.values"/>
- 18、 访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/>
- 19、 投影(过滤):<s:property value="users.{?#this.age==1}[0]"/>
- 20、 投影:<s:property value="users.{^#this.age>1}.{age}"/>
- 21、 投影:<s:property value="users.{$#this.age>1}.{age}"/>
- 22、 投影:<s:property value="users.{$#this.age>1}.{age} == null"/>
- 23、 []:<s:property value="[0].username"/> 通过[]访问ValueStack
- 24、 什么时候会用两个action?答:当使用chain进行action之间的跳转的时候,会把所有用到的action都压缩进去。
十七、Struts Tags
[list]
<s:bean name="com.bjsxt.struts2.tags.Dog" > <s:param name="name" value="'pp'"></s:param> <s:property value="name"/> </s:bean>
bean 查看debug情况:
<s:bean name="com.bjsxt.struts2.tags.Dog" var="myDog"> <s:param name="name" value="'oudy'"></s:param> </s:bean>
拿出值:<s:property value="#myDog.name"/>
age = <s:property value="#parameters.age[0]" /> <br /> <s:if test="#parameters.age[0] < 0">wrong age!</s:if> <s:elseif test="#parameters.age[0] < 20">too young!</s:elseif> <s:else>yeah!</s:else><br />
判断取值是否为空:
<s:if test="#parameters.aaa == null">null</s:if>
<s:iterator value="{1, 2, 3}" > <s:property/> | </s:iterator> </li> <li>自定义变量:<br /> <s:iterator value="{'aaa', 'bbb', 'ccc'}" var="x"> <s:property value="#x.toUpperCase()"/> | </s:iterator> </li> <li>使用status:<br /> <s:iterator value="{'aaa', 'bbb', 'ccc'}" status="status"> <s:property/> | 遍历过的元素总数:<s:property value="#status.count"/> | 遍历过的元素索引:<s:property value="#status.index"/> | 当前是偶数?:<s:property value="#status.even"/> | 当前是奇数?:<s:property value="#status.odd"/> | 是第一个元素吗?:<s:property value="#status.first"/> | 是最后一个元素吗?:<s:property value="#status.last"/> <br /> </s:iterator> </li>
<li> <s:iterator value="#{1:'a', 2:'b', 3:'c'}" > <s:property value="key"/> | <s:property value="value"/> <br /> </s:iterator> </li> <li> <s:iterator value="#{1:'a', 2:'b', 3:'c'}" var="x"> <s:property value="#x.key"/> | <s:property value="#x.value"/> <br /> </s:iterator> </li>
[/list]
十八、Struts里面的异常处理
1、 一个单独的action里面的异常
<action name="*-*" class="xiong.rui.love.action.{1}Action" method="{2}" > <result>/admin/{1}-{2}.jsp</result> <result name="input" >/admin/{1}-{2}.jsp</result> <exception-mapping result="error" exception="java.lang.Exception" /> <result name="error" >/error.jsp</result> </action>
2、 所有异常的处理
(1)、如果每个单独的action要处理异常的页面不样,则新建一个全局的包,并让要处理异常的包继承这个包:
<package name="default-exception" namespace="/" extends="struts-default" > <global-exception-mappings> <exception-mapping result="error" exception="java.lang.Exception" /> </global-exception-mappings> </package>
(2)、统一处理所有异常
<package name="default-exception" namespace="/" extends="struts-default" > <global-results> <result name="error" >/error.jsp</result> </global-results> <global-exception-mappings> <exception-mapping result="error" exception="java.lang.Exception" /> </global-exception-mappings> </package>
十九、国际化
1、javaProject里面的国际化
利用properties文件存储要显示信息,用相同的key值,当使用中文的时候,要使用e:\JAVA\JDK\bin\native2ascii命令转换。Eg: e:\JAVA\JDK\bin\native2ascii app_zh_CN_temp.properties app_zh_CN.properties
注意:要转换的文件应该和你的机器的中文编码方式一样:我的是GBK,故app_zh_CN_temp.properties为GBK编码。
3、 struts里面的国际化
(1)、action级别的,极少用或者就是不用
Properties文件为名称为:xxAction_zh_CN.properties
Properties文件值的获取方法:<s:property value=”getText(‘login.username’)” />
第二种获取properties值的方法:<s:text name=”login.username” />
(2)、全局设置
src目录下面建立文件xxx_zh_CN.properties,xxx表示任何字母组合,不过要在struts.xml声明<constant name="struts.custom.i18n.resources" value="xxx"></constant>,这样就可以使用国际化了!
在使用国际化的配置文件中,也可以动态的指定显示内容:
welcome.msg=welcome,{0} {0}为动态指定一个内容,使用标签<s:text>时,传入参数即可。
<s:text name="welcome.msg"> <s:param value="username" ></s:param> </s:text>
二十、数据类型转换
1、 String转换成Date类型
(1)、设置数据类型为java.util.Date
(2)、传入参数的格式为:月/日/年 eg:10/16/1992
(3)、获取日期类型的方法:<s:property value="date" />或者<s:date name="date" format="yyyy-MM-dd HH:mm:ss"/><br/>
2、String转换成List<String>
(1)、必须使用泛型
(2)、传入参数的方式:list=first&list=second
(3)、获取参数的方式:<s:property value=”list” />
3、String转换成Map<String , String>
(1)、必须使用泛型
(2)、传入参数的方式:map['age']=age&map['name']=name
(3)、获取参数的方式:<s:property value=”map” />
发表评论
-
SpringMVC与Mybatis集成开发环境搭建
2014-08-04 11:14 1193SpringMVC与Mybatis集成开发环境搭建 ... -
struts处理AJAX请求
2013-07-06 10:56 935struts处理AJAX请求 1、使用AJAX向stru ... -
struts里面的方法校验
2013-06-02 10:13 845struts里面的方法校验 一、全局方法检验 1、校验 ... -
struts多文件上传
2013-06-02 09:15 873struts多文件上传 1、文件载入页面 & ... -
struts中的文件上传
2013-06-01 20:19 975struts中的文件上传 1、上传页面代码 <b ... -
Spring AOP 简单使用
2013-05-04 17:30 1338Spring AOP 在beans.xml进行配置,声明aop ... -
Spring IoC Annotation 的简单使用
2013-05-04 17:22 1058Spring IOC Annotation 进行Annotat ... -
Spring IOC XML Configuration
2013-05-04 17:10 1236Spring Note Spring Introdution ... -
Spring DBCP 数据库连接池配置
2013-05-04 17:01 3209Spring dbcp 数据库连接池 ... -
Spring IOC(DI)模拟
2013-05-03 19:37 884Spring DI Simulation 解释:IOC Inv ... -
Hibernate 里面的1+N问题
2013-04-28 09:02 874Hibernate之1+N问题 1、 Category类 pa ... -
Hibernate 二级缓存举例(4.2 Final版)
2013-04-28 09:02 1187Hibernate 4.2里面的缓存 1、 hibernate ... -
HQL 简单使用二
2013-04-26 10:05 955HQL的简单使用2 1、 Category类 package ... -
Annotation使用两个foreign key做联合主键
2013-04-26 09:57 1517Annotation使用两个foreign key做联合主键 ... -
hibernate HQL的简单使用一
2013-04-26 08:51 1066Hibernate中的HQL使用 1、 建立相应的关系表 Ca ... -
JSP 自定义标签
2013-04-24 22:47 878JSP自定义标签(<mytag:mylove /> ...
相关推荐
根据给定的文件信息,以下是对Struts2学习笔记中涉及的关键知识点的详细解析: ### Struts2框架概览 #### MVC模式的理解与演进 Struts2是基于MVC(Model-View-Controller)模式设计的一种Java Web开发框架。在MVC...
### Struts2学习笔记知识点概览 #### 一、环境搭建 **1.1 Struts2简介** - **Struts2概述**:Struts2是一个开源的MVC框架,它结合了Struts 1.x、WebWork和其他一些框架的优点。Struts2的主要目标是简化Web应用程序...
### Struts2学习笔记知识点详解 #### 一、准备工作及实例 **1. 解压struts-2.1.6-all.zip** - **Apps目录**:包含struts2自带的例子程序,供用户学习和参考。 - **Docs目录**:提供官方文档,包括API文档、指南等...
### Struts2学习笔记知识点详解 #### 一、Struts2框架的基本引入步骤 ##### 1. 导入Struts2相关Jar包 在引入Struts2框架时,首先需要将Struts2的相关Jar包导入到项目的类路径中。这些Jar包通常包括核心库以及其他...
在Struts2中,学习笔记通常会涵盖以下几个关键概念: 1. **源代码查看和Javadoc**:开发者可以通过查看源代码来理解Struts2的工作原理,而Javadoc则提供了API文档,帮助理解类和方法的功能。 2. **包(Package)和...
Struts2是一个强大的Java web应用程序开发框架,它遵循Model-View-Controller (MVC)设计模式,用于构建可维护性和可扩展性高的企业级应用。本文将深入探讨Struts2的核心概念,包括Action、Result、配置文件、OGNL与...
张龙圣思园的Struts2学习笔记,无疑为Java开发者提供了一份宝贵的参考资料,它可能涵盖了Struts2的基础概念、核心组件、配置方式以及实战技巧。 首先,让我们深入了解Struts2的核心特性。Struts2是MVC(Model-View-...
本笔记将全面总结Struts2的核心概念、主要功能以及实际开发中的应用。 一、Struts2概述 Struts2是Apache软件基金会下的一个开源项目,它继承了Struts1的优点并解决了其存在的问题,如性能和灵活性。Struts2的核心是...