??xml version="1.0" encoding="utf-8" standalone="yes"?> 讉K值栈中对象的普通属?get setҎ(gu))Q?/span> <s:property value="user.age"/> <s:property value="user['age']"/> <s:property value="user[""age""]"/> wrong: <%--<s:property value="user[age]"/>--%> 讉K值栈中对象的普通属?get setҎ(gu)): <s:property value="cat.friend.name"/> 讉K值栈中对象的普通方法:(x)<s:property value="password.length()"/> 讉K值栈中对象的普通方法:(x)<s:property value="cat.miaomiao()" /> 讉K值栈中action的普通方法:(x)<s:property value="m()" /> 讉K?rn)态方法:(x)<s:property value="@com.bjsxt.struts2.ognl.S@s()"/> 讉K?rn)态属性:(x)<s:property value="@com.bjsxt.struts2.ognl.S@STR"/> 讉KMathcȝ?rn)态方法:(x)<s:property value="@@max(2,3)" /> 讉K普通类的构造方法:(x) <s:property value="new com.bjsxt.struts2.ognl.User(8)"/> 讉KList:<s:property value="users"/> 讉KList中某个元?<s:property value="users[1]"/> 讉KList中元素某个属性的集合:<s:property value="users.{age}"/> 讉KList中元素某个属性的集合中的特定? <s:property value="users.{age}[0]"/> <s:property value="users[0].age"/> 讉KSet:<s:property value="dogs"/> 讉KSet中某个元?<s:property value="dogs[1]"/> <!--set是没有顺序的Q所以取下标值是没有意义?-> 讉KMap:<s:property value="dogMap"/> 讉KMap中某个元?<s:property value="dogMap.dog101"/> <s:property value="dogMap['dog101']"/> <s:property value="dogMap[""dog101""]"/><!--取出key为dog101的?-> 讉KMap中所有的key:<s:property value="dogMap.keys"/> 讉KMap中所有的value:<s:property value="dogMap.values"/> 讉K容器的大:(x)<s:property value="dogMap.size()"/> <s:property value="users.size"/> <!--不加ku9ohao也可以访?-> 投媄(jing)(qo(h))Q?lt;s:property value="users.{?#this.age==1}[0]"/><!--格式固定Qthis指@环过E中的每一个对象。取出users里age{于1的集合里面的W一个元?-> 投媄(jing)Q?lt;s:property value="users.{^#this.age>1}.{age}"/><!--^指第一个元?-> 投媄(jing)Q?lt;s:property value="users.{$#this.age>1}.{age}"/><!--$指结元素--> 投媄(jing)Q?lt;s:property value="users.{$#this.age>1}.{age} == null"/><!--查看age>1的user的age是否为空--> []:<s:property value="[0].username"/> <!--指value stack栈顶的那个ActionQ因为action在栈?值value stack从上往下数的第?个元?--> <!--[0]代表action的位|,而不是action那个对象Q[0]代表?往下数到栈底的对象的集合?-> <!--[0].usernameQ如果有多个actionQ在W一个action里找不到[0].usernameQ会(x)往下找--> <s:form action="submit.action" >
]]>
<s:textfield name="param" label="content"/>
<s:submit name="method1" value="" method="method1"/>
<s:submit name=" method1" value="" method="method1" />
</s:form>
]]>
XXX
} catch (Exception e) {
Super.addFieldError(“username”, “”);
Super.addActionError(“”);
}
OK如:(x)
<s:fielderror>
<s:param>username</s:param>
</s:fielderror>
<s:actionerror/>
fielderrorfielderrorMap-errorStruts2()
:<s:form theme="simple"> ,,Ҏ(gu)需要自己发?/span>
注:(x)我们只需要进行设|?/span>errorinputStruts2<result name=”input”>/input.jsp</result>
public class UserLoginAction extends ActionSupport implements ServletRequestAware {
public void setServletRequest(HttpServletRequest request) {
this.request=request;
}
requestrequest.getRemoteAddr()
actionSessionAwareMAPsession
public class UserLoginAction extends ActionSupport implements ServletRequestAware,SessionAware{
public void setServletRequest(HttpServletRequest request) {
this.request=request;
}
public void setSession(Map session) {
this.session=session;
}
Iocq种方式主要是利用了(jin)com.opensymphony.xwork2.ActionContextorg.apache.struts2.ServletActionContext获得requestA. HttpServletRequest request = ServletActionContext.getRequest ();
BActionContext ct = ActionContext.getContext()
HttpServletRequest request = (HttpServletRequest)ct.get(ServletActionContext. HTTP_REQUEST );
session?/span>Struts2sessionMapSessionMapsessionHttpSessionAMap session = ActionContext.getSession();
BMap session = (Map)ActionContext.getContext().get(ActionContext.SESSION);
SessionMapsessionHttpSessionHttpServletRequestrequest.getSession()HttpSessionSessionMapsession
<postfield name="param1" value="$(param1)" />
<postfield name="param2" value="$(param2)" />
<postfield name="struts.token.name" value="struts.token"/>
<postfield name="struts.token" value="${sessionScope['struts.token'] }"/>
</go>
</anchor>
2. <a href=””></a><s:url /><a href='
<s:url action="postParams">
<s:param name="param1" value="#stu.id" />
<s:param name="struts.token.name" value="struts.token" />
<s:param name="struts.token" value="${sessionScope['struts.token']}" />
</s:url>'>
</a>
3<s:a /> <s:url /><s:url id="toUrl" action="postParams" namespace="/wap">
<s:param name="param1" value="%{param1}"/>
<s:param name="param2" value="%{param2}" />
<s:param name="struts.token.name" value="struts.token" />
<s:param name="struts.token" value="${sessionScope['struts.token'] }"/>
</s:url>
<s:a href="%{toUrl}"></s:a>
WEB<s:form />
在struts2中action传递给jsp中的数据是保存在OgnlValueStack中的Q所以在jsp面中如果想利用脚本而不是sturts标签获取传入值的话,量使用OgnlValueStack的D得,例如Q?
<%...OgnlValueStack stack = (OgnlValueStack) request.getAttribute("struts.valueStack");
Article article = (Article)(stack.findValue("article"));%>
2 sturts2标签自动转换Html标签
在用struts2标签<s:property value="">来显CZ递值的时候,?x)将字符串中的html标签转换Q所以可以利用java脚本直接获取传入|使用方式见第一?br />
SSH2要点Q?br />
Struts2.1.8 要点Q?br />
01 struts2?qing)struts2开发环境的搭徏
02 W一个struts2应用开?br />
03 解决struts2配置文g无提C问?br />
04 Action名称的搜索顺?br />
05 Action配置的各w认?br />
06 result配置的各U视图{发类?br />
07 为Action属性注入?br />
08 指定Struts2处理的请求后~、常量定义、常用常?br />
09 Struts2的处理流E与Action的管理方?br />
10 为应用指定多个配|文?br />
11 动态方法调用和使用通配W定义action
12 h参数接收与采用复合类型接收请求参数及(qing)解决中文参数q问题
13 自定义类型{换器
14 全局cd转换?br />
15 讉K或添加request、session、application属?br />
16 文g上传
17 多文件上?br />
18 自定义拦截器
19 对Action中所有方法进行输入校?br />
20 对action指定Ҏ(gu)q行校验
21 输入校验的流E?br />
22 ZXML配置方式实现对action的所有方法进行校?br />
23 ZXML配置方式实现Ҏ(gu)定actionҎ(gu)校验与基于XML配置校验的一些特?br />
24 配置国际化全局资源文g、输出国际化信息
25 输出带有占位W的国际化信?br />
26 配置包范围国际化资源文g
27 配置Action范围国际化资源文?br />
28 ognl表达?br />
29 struts2常用标签解说
30 防止表单重复提交
Spring2.5 要点Q?br />
01 全面阐释Spring?qing)其各项功?br />
02 搭徏与测试Spring的开发环?nbsp;
03 ~码剖析Spring理Bean的原?nbsp;
04 Spring的三U实例化Bean的方?nbsp;
05 配置Spring理的bean的作用域
06 Spring理的Bean的生命周?nbsp;
07 ~码剖析Spring依赖注入的原?nbsp;
08 ~码剖析Spring装配基本属性的原理
09 Spring如何装配各种集合cd的属?nbsp;
10 使用构造器装配属?nbsp;
11 用@Resource注解完成属性装?nbsp;
12 ~码剖析@Resource注解的实现原?nbsp;
13 @Autowire注解与自动装?nbsp;
14 让Spring自动扫描和管理Bean
15 使用JDK中的Proxy技术实现AOP功能
16 使用CGLIB实现AOP功能与AOP概念解释
17 使用Spring的注解方式实现AOP入门
18 使用Spring的注解方式实现AOP的细?nbsp;
19 使用Spring配置文g实现AOP
20 aspectj的切入点语法定义l节
21 搭徏和配|Spring与jdbc整合的环?nbsp;
22 Spring集成的jdbc~码和事务管?nbsp;
23 使用Spring注解方式理事务与传播行?nbsp;
24 使用Spring配置文g实现事务理
25 搭徏和配|Spring与Hibernate整合的环?nbsp;
26 Spring集成的Hibernate~码与测?nbsp;
27 Struts与Spring集成Ҏ(gu)1(Struts集成Spring)
28 Struts与Spring集成Ҏ(gu)2(Spring集成Struts)
29 为Spring集成的Hibernate配置二~存
30 Spring提供的CharacterEncoding和OpenSessionInView功能
31 使用Spring集成JPA
32 Struts+Spring+JPA集成
33 使用Spring集成Struts2
Hibernate3.3要点Q?br />
01 hibernate介绍与动手入门体?br />
02 hibernate入门案例的细节分?br />
03 hibernate入门案例的代码优?br />
04 Session接口?qing)get|load|persistҎ(gu)
05 实体对象的三U状态与saveOrUpdateҎ(gu)
06 完善HibernateUtilcd(qing)hql查询入门
07 实体cL属性名与数据库关键字冲H问?br />
08 hql的命名参CQuery接口的分|?br />
09 Criteria查询方式
10 使用Hibernate完成CRUD实验的步骤说?br />
11 完成CRUD实验q回֒补充l节知识Q上Q?br />
12 完成CRUD实验q回֒补充l节知识Q下Q?br />
13 ȝ分析W一天的讲解内容
14 多对一兌关系的映与原理分析
15 多对一兌关系的检索与原理分析
16 保存多对一兌关系的更q一步分?br />
17 一对多兌关系的映与原理分析
18 一对一主键兌关系的映与原理分析
19 一对一主键兌关系的检?br />
20 一对一外键兌关系的映与原理分析
21 多对多关联关pȝ映射与原理分?br />
22 多对多关联关pȝ(g)?br />
23 lg兌关系的映与原理分析
24 兌关系的ȝ
25 Hibernate中用的集合cd
26 兌关系的联操?br />
27 inverse属性的作用与原理分?br />
28 分析有序集合与多对多中的inverse属?br />
29 l承关系_整个l承?wi)映到一张表
30 l承关系_每个cL到一张表
31 l承关系_鉴别器与内连接相l合
32 l承关系_每个具体cL一张独立表
33 loadҎ(gu)的懒加蝲?qing)原理分?br />
34 一对一的懒加蝲分析
35 一对多和多对多的懒加蝲分析
36 多对一与一对一的懒加蝲原理分析
37 懒加载的一些扩充细?br />
38 ~存的原理与模拟分析
39 hibernate的内部缓存分?br />
40 hibernate的二U缓存配|与分析
41 hibernate二~存的扩充细?br />
42 分布式缓存的分析与研?br />
43 事务与事务边界的相关知识
44 OpenSessionInView模式的代码分?br />
45 OpenSessionInView的时序图与缺点分?br />
46 事务中的(zhn)观锁与乐观?br />
47 串讲hibernate配置文g中的配置?br />
48 串讲hibernate映射文g中的配置?br />
49 Hibernate映射cd
50 Session与SessionFactory的多U程问题
51 Session的内部缓存管理与扚w更新
52 Hql与Criteria查询的补充知?br />
53 iterate查询与N+1此查询问?br />
54 Hibernate的拦截器与监听器
55 本地sql查询与命名查?br />
56 Hiberante的最?jng)_?br />
jar作用的详解:(x)
spring.jar 是包含有完整发布模块的单个jar 包。但是不包括mock.jar, aspects.jar, spring-
portlet.jar, and spring-hibernate2.jar?
spring-src.zip是所有的源代码压~包?
除了(jin)spring.jar 文gQSpring q包括有其它21个独立的jar 包,各自包含着对应的SpringlgQ用户可以根据自q需要来选择l合自己的jar 包,而不必引入整个spring.jar 的所有类文g?
spring-core.jar
q个jar 文g包含Spring 框架基本的核?j)工L(fng)。Spring 其它lg要都要用到q个包里的类Q是?/p>
它组件的基本核心(j)Q当然你也可以在自己的应用系l中使用q些工具cR外部依赖Commons LoggingQ?(Log4J)?
spring-beans.jar
q个jar 文g是所有应用都要用到的Q它包含讉K配置文g、创建和理bean 以及(qing)q行Inversion of Control / Dependency InjectionQIoC/DIQ操作相关的所有类。如果应用只需基本的IoC/DI 支持Q引入spring-core.jar ?qing)spring-beans.jar 文g可以了(jin)?
外部依赖spring-coreQ?CGLIB)?
spring-aop.jar
q个jar 文g包含在应用中使用Spring 的AOP Ҏ(gu)时所需的类和源码元数据支持。用基于AOP 的SpringҎ(gu),如声明型事务理QDeclarative Transaction ManagementQ,也要在应用里包含q个jar包?
外部依赖spring-coreQ?(spring-beansQAOP AllianceQ?CGLIBQCommons Attributes)?
spring-context.jar
q个jar 文g为Spring 核心(j)提供?jin)大量扩展。可以找C用Spring ApplicationContextҎ(gu)时所需的全部类QJDNI 所需的全部类Qinstrumentationlg以及(qing)校验Validation 斚w的相关类,外部依赖spring-beans, (spring-aop)?
spring-dao.jar
q个jar 文g包含Spring DAO、Spring Transaction q行数据讉K的所有类。ؓ(f)?jin)用声明型事务支持Q还需在自q应用里包含spring-aop.jar。外部依赖spring-coreQ?spring-aopQ?spring-contextQ?JTA API)?
spring-jdbc.jar
q个jar 文g包含对Spring 对JDBC 数据讉Kq行装的所有类。外部依赖spring-beansQspring-dao?
spring-support.jar
q个jar 文g包含支持UI模版QVelocityQFreeMarkerQJasperReportsQ,邮g服务Q脚本服?JRuby)Q缓存CacheQEHCacheQ,d计划SchedulingQuartzQ方面的cR外部依赖spring-context, (spring-jdbc, Velocity, FreeMarker, JasperReports, BSH, Groovy, JRuby, Quartz, EHCache)
spring-web.jar
q个jar 文g包含Web 应用开发时Q用到Spring 框架时所需的核?j)类Q包括自动蝲入Web Application Context Ҏ(gu)的cRStruts 与JSF 集成cR文件上传的支持cRFilter cd大量工具辅助cR外部依赖spring-context, Servlet API, (JSP API, JSTL, Commons FileUpload, COS)?
spring-webmvc.jar
q个jar 文g包含Spring MVC 框架相关的所有类。包括框架的ServletsQW(xu)eb MVC框架Q控制器和视图支持。当?dng)如果你的应用使用了(jin)独立的MVC 框架Q则无需q个JAR 文g里的McR外部依赖spring-web, (spring-supportQTilesQiTextQPOI)?
spring-portlet.jar
spring自己实现的一个类似Spring MVC的框架。包括一个MVC框架和控制器。外部依赖spring-webQ?Portlet APIQ?spring-webmvc)?
spring-struts.jar
Struts框架支持Q可以更方便更容易的集成Struts框架。外部依赖spring-webQStruts?
spring-remoting.jar
q个jar 文g包含支持EJB、远E调用RemotingQRMI、Hessian、Burlap、Http Invoker、JAX-RPCQ方面的cR外部依赖spring-aopQ?(spring-contextQspring-webQHessianQBurlapQJAX-RPCQEJB API)?
spring-jmx.jar
q个jar包提供了(jin)对JMX 1.0/1.2的支持类。外部依赖spring-beansQspring-aopQ?JMX API?
spring-jms.jar
q个jar包提供了(jin)对JMS 1.0.2/1.1的支持类。外部依赖spring-beansQspring-daoQJMS API?
spring-jca.jar
对JCA 1.0的支持。外部依赖spring-beansQspring-daoQ?JCA API?
spring-jdo.jar
对JDO 1.0/2.0的支持。外部依赖spring-jdbcQ?JDO APIQ?(spring-web)?
spring-jpa.jar
对JPA 1.0的支持。外部依赖spring-jdbcQ?JPA APIQ?(spring-web)?
spring-hibernate2.jar
对Hibernate 2.1的支持,已经不徏议用。外部依赖spring-jdbcQHibernate2Q?spring-web)?
spring-hibernate3.jar
对Hibernate 3.0/3.1/3.2的支持。外部依赖spring-jdbcQHibernate3Q?spring-web)?
spring-toplink.jar
对TopLink框架的支持。外部依赖spring-jdbcQTopLink?
spring-ibatis.jar
对iBATIS SQL Maps的支持。外部依赖spring-jdbcQiBATIS SQL Maps。另外的两个包?
spring-mock.jar
q个jar 文g包含Spring 一整套mock cL辅助应用的测试。Spring 试套g使用?jin)其中大量mock c,q样试更加简单。模拟HttpServletRequest 和HttpServletResponse cdWeb 应用单元试是很方便的。ƈ且提供了(jin)对JUnit的支持。外部依赖spring-core?
spring-aspects.jar
提供对AspectJ的支持,以便可以方便的将面向斚w的功能集成进IDE中,比如Eclipse AJDT。外部依赖。WEAVER JARS (dist/weavers)说明?
spring-agent.jar
Spring的InstrumentationSavingAgent (为InstrumentationLoadTimeWeaver)Q一个设备代理包Q可以参考JDK1.5的Instrumentation功能获得更多信息。外部依赖none (for use at JVM startup: "-javaagent:spring-agent.jar")?
spring-tomcat-weaver.jar
扩展Tomcat的ClassLoaderQ其可以用instrumentationQ设备)(j)cR外部依赖none (for deployment into Tomcat's "server/lib" directory)。如果需要用JSP语言作ؓ(f)Spring's web MVC tags的参敎ͼ则需要JSP 2.0的支持。或者选择Jakarta的JSTL (standard.jar)。如何选择q些发布包,军_选用哪些发布包其实相当简单。如果你正在构徏Web 应用q将全程使用SpringQ那么最好就使用单个全部的spring.jar 文gQ如果你的应用仅仅用到简单的Inversion of Control / Dependency InjectionQIoC/DIQ容器,那么只需spring-core.jar与spring-beans.jar 卛_Q如果你对发布的大小要求很高Q那么就得精?xi)细选了(jin)Q只取包含自己所需Ҏ(gu)的jar 文g?jin)。采用独立的发布包你可以避免包含自己的应用不需要的全部cR当然你可以采用其它的一些工h设法令整个应用包变小Q节省空间的重点在于准确地找?gu)己所需?Spring 依赖c,然后合ƈ所需的类与包可以了(jin)。Eclispe 有个插g叫ClassPathHelper 可以帮你找找所依赖的类
Hibernate一共包括了(jin)23个jar包,令hD~ؕ。下载HibernateQ例?.0.3E_版本Q解压羃Q可以看?
一个hibernate2.jar和lib目录下有22个jar包:(x)
hibernate2.jar:
Hibernate的库Q没有什么可说的Q必M用的jar?
cglib-asm.jar:
CGLIB库,Hibernate用它来实现PO字节码的动态生成,非常核心(j)的库Q必M用的jar?
dom4j.jar:
dom4j是一个Java的XML APIQ类gjdomQ用来读写XML文g的。dom4j是一个非帔R怼U的Java XML APIQ具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的YӞ可以在SourceForge上找到它。在IBM developerWorks上面可以扑ֈ一文章,对主的Java XML APIq行 的性能、功能和易用性的评测Qdom4j无论在那个方面都是非常出色的。我早在近两年之前开始 用dom4jQ直到现在。如今你可以看到来多的Java软g都在使用dom4j来读写XMLQ特别值得一提的 是连Sun的JAXM也在用dom4j。这是必M用的jar包,Hibernate用它来读写配|文件?
odmg.jar:
ODMG是一个ORM的规范,Hibernate实现?jin)ODMG规范Q这是一个核?j)的库,必须使用的jar包?
commons-collections.jarQ?
Apache Commons包中的一个,包含?jin)一些Apache开发的集合c,功能比java.util.*强大。必M用的jar包?
commons-beanutils.jarQ?
Apache Commons包中的一个,包含?jin)一些Bean工具cȝ。必M用的jar包?
commons-lang.jar:
Apache Commons包中的一个,包含?jin)一些数据类型工L(fng)Q是java.lang.*的扩展。必M用的jar包?
commons-logging.jar:
Apache Commons包中的一个,包含?jin)日志功能,必须使用的jar包。这个包本n包含?jin)一个Simple LoggerQ但是功能很弱。在q行的时候它?x)先在CLASSPATH找log4jQ如果有Q就使用log4jQ如果没有,找JDK1.4带的java.util.loggingQ如果也找不到就用Simple Logger。commons-logging.jar的出现是一个历史的的遗留的遗憾Q当初Apache极力游说Sun把log4j加入JDK1.4Q然而JDK1.4目组已经 接近发布JDK1.4产品的时间了(jin)Q因此拒l了(jin)Apache的要求,使用自己的java.util.loggingQ这个包的功能比log4j差的很远Q性能也一般?后来Apache开发出来了(jin)commons-logging.jar用来兼容两个logger。因此用commons-logging.jar 写的logE序Q底层的Logger是可以切换的Q你可以选择log4jQjava.util.logging或者它自带?Simple Logger。不q我仍然强烈使用log4jQ因为log4j性能很高Qlog输出信息旉几乎{于 System.outQ而处理一条logq_只需?us。你可以在Hibernate的src目录下找到Hibernate已经Z准备好了(jin)的log4j的配|文Ӟ你只需要到Apache |站M载log4j可以了(jin)。commons-logging.jar也是必须的jar包?使用Hibernate必须的jar包就是以上的q几个,剩下的都是可选的?
ant.jar:
Ant~译工具的jar包,用来~译Hibernate源代码的。如果你不准备修改和~译Hibernate源代码,那么没有什么用Q可选的jar?
optional.jarQ?
Ant的一个辅助包?
c3p0.jarQ?
C3PO是一个数据库q接池,Hibernate可以配置Z用C3POq接池。如果你准备用这个连接池Q就需要这个jar包?
proxool.jarQ?
也是一个连接池Q同上?
commons-pool.jar, commons-dbcp.jar:
DBCP数据库连接池QApache的Jakartal织开发的QTomcat4的连接池也是DBCP。实际上Hibernate自己也实C(jin)一个非帔R常简单的数据库连接池Q加上上?个,你实际上可以?Hibernate上选择4U不同的数据库连接池Q选择哪一个看个h的偏好,不过DBCP可能更通用一些。另外强调一点,如果在EJB中用HibernateQ一定要用App Server的连接池Q不要用以上4U连接池Q否则容器管理事务不起作用?
connector.jar:
JCA 规范Q如果你在App Server上把Hibernate配置为Connector的话Q就需要这个jar。不q实际上一般App Server肯定?x)带上这个包Q所以实际上是多余的包?
jaas.jar:
JAAS是用来进行权限验证的Q已l包含在JDK1.4里面?jin)。所以实际上是多余的包?
jcs.jarQ?
如果你准备在Hibernate中用JCS的话Q那么必d括它Q否则就不用?
jdbc2_0-stdext.jar:
JDBC2.0的扩展包Q一般来说数据库q接池会(x)用上它。不qApp Server都会(x)带上Q所以也是多余的?
jta.jarQ?
JTA规范Q当Hibernate使用JTA的时候需要,不过App Server都会(x)带上Q所以也是多余的?/p>
2. @[]@[|]@java.lang.String@format(‘foo%s’, ‘bar’)@cn.itcast.Constant@APP_NAME
1. ognl(Context)MAPjava.utils.MapStruts2(Context)ActionContextContextStruts2OGNLAcionContext
Struts2ActionContextValueStackactionactionValueStackactionOGNL讉K上下文(Context##application#session
OGNLrootStruts2ValueStackValueStack#?/span>Struts2ValueStackOgnlValueStackOgnlValueStackListroot?/span>rootOGNLroot注意Q?/span>StrutsOGNLStruts:<s:property value=”name”/>
ValueStackStruts2OGNLJSPELValueStack${foo} //foo如果讉K其他Context#applicationQ用于访?/span>ServletContext#application.userName#application[‘userName’]ServletContextgetAttribute(“username”)
sessionQ用来访?/span>HttpSession#session.userName#session[‘userName’]session.getAttribue(“userName”)
requestQ用来访?/span>HttpServletRequestattributeMap#request.userName#request[‘userName’],request.getAttribute(“username”)
parametersQ用于访?/span>HTTP#parameters.userName#parameters[‘userName’]相当于调?/span>request.getParameter(“username”)
attrQ用于按page->request->session->applicationZ?/span>ELvalueStack因ؓ(f)Struts2HttpServletRequest采用OGNLValueStack采用OGNLList/Map如果需要一个集合元素的时候(例如ListMapOGNL例如使用如下代码直接生成一?/span>List<s:set name=”list” value=”{‘zhangming’,’xiaoli’,’liming’}”/>
<s:iterator value=”#list”>
<s:property /><br/>
</s:iterator>
setscopeapplicationsessionrequestpageactionOGNL ContextvaluevalueStack生成一?/span>Map<s:set name=”foobar” value=”#{‘foo1’:’bar1’,’foo2’:’bar2’}” />
<s:iterator value=”#foobar” >
<s:property value=”key”>=<s:property value=”value”/>
</s:iterator>
OGNL对于集合cdQ?/span>OGNLinnot ininnot inin<s:if test=”’foo’ in {‘foo’,’bar’}>
zai
</s:if>
<s:else>
bu zai
</s:else>
not in <s:if test”’foo’ not in {‘foo’,’bar’}>
bu zai
</s:if>
<s:else>
zai
</s:else>
OGNL---除了(jin)innot inOGNL3?:^:$:例如代码Q?/span>
<s:iterator value=”books.{?#this.price > 35}”>
<s:property value=”title”/>-$<s:property value=”price” /><br/>
</s:iterator>
.{}{}thisbooksbooksthis35books.{?#this.price > 35}
books.{……} ……value?#this:二十四?/span>Struts2 property<s:set name=”name” value=”kk” />
<s:property value=”#name” />
default:NULLescape:HTMLvalue:valueStackid:iterator iteratorListSet<s:set name="list" value="{'zhangming','xiaoi','liming'}"/>
<s:iterator value="#list" status="st">
<font color=<s:if test="#st.odd">red</s:if><s:else>blue</s:else>>
<s:property /></font>/<br>
</s:iterator>
value:ValueStackid:idstatus:iteratorStatus int getCount(), int getIndex(), Boolean isEven(), Boolean isOdd(), Boolean isFirst(), Boolean isLast(),if/elseif/else s:set name="age" value="323" scope="request"/>
<s:if test="#request.age==23">
23
</s:if>
<s:elseif test="#request.age==21">
21
</s:elseif>
<s:else>
</s:else>
url<a href="<s:url action="helloworld_add" namespace="/test"><s:param name="personid" value="233"/></s:url>">ssss</a>
<s:set name="myurl" value="'http://www.foshanshop.net'"/>
<s:url value="%{#myurl}" /><br>
checkboxlist/radio /select list:
<s:checkboxlist name="list"
list="{'Java','.Net','RoR','PHP'}" value="{'Java','.Net'}"/><br/>
map:
<s:checkboxlist name="map" list="#{1:'',2:'',3:'',4:''}"
listKey="key" listValue="value" value="{1,2,3}"/><br/>
<s:radio name="raido1" list="#{1:'',2:'',3:'',4:''}" listKey="key" listValue="value" value="1"/>
<br/>
<s:select name="se" list="#{1:'',2:'',3:'',4:''}" listKey="key" listValue="value" value="1"/>
<!-- ,struts2 -->
<constant name="struts.ui.theme" value="simple" />
目前对笔者不适用Q由于时间紧q,不再记录
StrutsPrepareAndExccuterFilterStruts2<url-pattern>/*</url-pattern>Filter.actionStruts2Struts2Struts2ActionStruts1Struts2ActionStruts2Action
十四?/span>Struts2配|文件以模块q行划分Q然后通过include<?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>
<include file="struts-user.xml"></include>
<include file="struts-trade.xml"></include>
</struts>
Struts2(Struts2.1)
action!+public class HelloWorldAction{
private String message;
public String getMessage(){
return message;
}
public String execute() throws Exception{
this.message = “execute”
return “success”;
}
public String other() throw Exception{
this.message = “other”;
}
}
actionURL/struts2/test/helloworld.action
actionother/struts2/test/helloworld!other.action
struts.enable.DynamicMethodInvocation.
<constant name=”struts.enable.DynamicMethodInvocation” value=”false”/>
Struts2action()
<package name=”employee”
namespace=”/control/employee” extends=”struts-default”>
<action name=”list_*”
class=”cn.itcast.action.HellWorldAction method=”{1}”>
<result name=”success”>
/WEB-INF/page/message.jsp
</result>
</action>
</package>
a). *?/span>: list_*_*_*
b). method=”{1}” *
c). ?/span> classresult十六?/span>Struts2 以下两种Ҏ(gu)Q当参数比较多的时候,用第一U方法,会(x)发现actionsettergetteractiona). (get/post)
ActionStruts2如:(x)h路径Q?/span>http://localhost:8080/test/view.action?id=78
public class ProductAction{
private Integer id;
//struts2setter public void setId(Integer id) {
this.id = id;
}
public Integer getId{
return id;
}
}
b). 如:(x)h路径Q?/span>http://localhost:8080/test/view.action?product.id=78
public class ProductAction{
private Product product;
public void setProduct(Product product) {
this.product = product;
}
public Product getProduct() {
return product;
}
}
Struts2Productproductproductsetter
十七?/span>Struts2局部类型{换器/a). package cn.itcast.type.converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
publicclass DateTypeConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map<String, Object> context, Object value, Class toType) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
try {
if(toType == Date.class){//Date String[] params = (String[]) value;// request.getParameterValues()
return dateFormat.parse(params[0]);
}elseif(toType == String.class){//Date Date date = (Date) value;
return dateFormat.format(date);
}
} catch (ParseException e) {}
returnnull;
}
}
?/span>ActionActionClassName-conversion.propertiesActionClassNameAction-conversion.propertiesHelloWroldAction-conversion.propertiespropertiesbirthday=cn.itcast.type.converter.DateTypeConverter
b).上面的局部类型{换器注册为全局cd转换器:(x)
WEB-INF/classesxwork-conversion.propertiesproperties待{换的cd=java.util.Date=cn.itcast.conversion.DateConverter
request/session/applicationimport java.util.Arrays;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
public class HelloWorldAction {
public String execute(){
ActionContext ctx = ActionContext.getContext();
ctx.getApplication().put("app", "");//ServletContextapp
ctx.getSession().put("ses", "session");//sessionses
ctx.put("req", "request");//requestreq
ctx.put("names", Arrays.asList("", "", ""));
return "message";
}
public String rsa() throws Exception{
HttpServletRequest request = ServletActionContext.getRequest();
ServletContext servletContext = ServletActionContext.getServletContext();
request.setAttribute("req", "");
request.getSession().setAttribute("ses", "");
servletContext.setAttribute("app", "");
//HttpServletResponse response = ServletActionContext.getResponse();
return "message";
}
}
ognlJSTLELognl
Struts 2org.apache.Struts2.config.DefaultConfigurationStruts 2ConfigurationStruts 2struts.locale
WebLocalestruts.i18n.encoding
WebGBKGB2312提示Q当讄该参Cؓ(f)GBKHttpServletRequestsetCharacterEncodingstruts.objectFactory
Struts 2ObjectFactory Beanspringstruts.objectFactory.spring.autoWrite
SpringnameBeannamestruts.objectFactory.spring.useClassCache
SpringBeantruefalsetruestruts.objectTypeDeterminer
Struts 2tigernotigerstruts.multipart.parser
multipart/form-dataMIMEcospelljakartacospellcommon-fileuploadjakarta注意cospellJARWebcoscosJARWEB-INF/libstruts.multipart.saveDir
javax.servlet.context.tempdirstruts.multipart.maxSize
Struts 2struts.custom.properties
Struts 2struts.properties,struts.mapper.class
HTTPActionStruts 2org.apache.struts2.dispatcher.mapper.DefaultActionMapperActionnamestruts.action.extension
Struts 2action*.actionStruts 2,struts.serve.static
JARtruefalsetruestruts.serve.static.browserCache
falsestruts.enable.DynamicMethodInvocation
Struts 2truefalsestruts.enable.SlashesInActionNames
Struts 2ActionfalseActiontruestruts.tag.altSyntax
Struts 2truetruestruts.devMode
Struts 2truetrueflasefalsetruefalsestruts.i18n.reload
HTTPfalsetruefalse提示Q开发阶D将该属性设|了(jin)true falsestruts.ui.theme
xhtmlstruts.ui.templateDir
templatetemplatestruts.ui.templateSuffix
ftlftlvmjspFreeMarkerVelocityJSPstruts.configuration.xml.reload
struts.xmlfalsestruts.velocity.configfile
Velocityvelocity.propertiesvelocity.propertiesstruts.velocity.contexts
VelocityContextContextContext,struts.velocity.toolboxlocation
Velocitytoolboxstruts.url.http.port
WebStruts 2URLUrlWebstruts.url.https.port
struts.url.http.portWebstruts.url.includeParams
Struts 2URLnonegetallGETstruts.custom.i18n.resources
Struts 2,struts.dispatcher.parametersWorkaround
Java EEHttpServlet RequestgetParameterMap()truefalse WebLogicOrionOC4Jtruestruts.freemarker.manager.classname
Struts 2FreeMarkerorg.apache.struts2.views.freemarker.FreemarkerManagerStruts 2FreeMarkerstruts.freemarker.wrapper.altMap
truefalsetruestruts.xslt.nocache
XSLT Resulttruefalsestruts.configuration.files
Struts 2,struts- default.xml,struts-plugin.xml,struts.xmlStruts 2struts.xml
AQ?
<s:a xhref=""></s:a>-----链接,cM于html里的<a></a>
<s:action name=""></s:action>-----执行一个view里面的一个action
<s:actionerror/>-----如果action的errors有值那么显C出?
<s:actionmessage/>-----如果action的message有值那么显C出?
<s:append></s:append>-----d一个值到l(f)istQ类glist.add();
<s:autocompleter></s:autocompleter>-----自动完成<s:combobox>标签的内容,q个是ajax
BQ?
<s:bean name=""></s:bean>-----cM于struts1.x中的QJavaBean的?
CQ?
<s:checkbox></s:checkbox>-----复选框
<s:checkboxlist list=""></s:checkboxlist>-----多选框
<s:combobox list=""></s:combobox>-----下拉?
<s:component></s:component>-----囑փW号
DQ?
<s:date/>-----获取日期格式
<s:datetimepicker></s:datetimepicker>-----日期输入?
<s:debug></s:debug>-----昄错误信息
<s:div></s:div>-----表示一个块Q类ghtml?lt;div></div>
<s:doubleselect list="" doubleName="" doubleList=""></s:doubleselect>-----双下拉框
EQ?
<s:if test=""></s:if>
<s:elseif test=""></s:elseif>
<s:else></s:else>-----q?个标{一起用,表示条g判断
FQ?
<s:fielderror></s:fielderror>-----昄文g错误信息
<s:file></s:file>-----文g上传
<s:form action=""></s:form>-----获取相应form的?
GQ?
<s:generator separator="" val=""></s:generator>----?lt;s:iterator>标签一起?
HQ?
<s:head/>-----?lt;head></head>里用,表示头文件结?
<s:hidden></s:hidden>-----隐藏?
IQ?
<s:i18n name=""></s:i18n>-----加蝲资源包到值堆?
<s:include value=""></s:include>-----包含一个输出,servlet或jsp面
<s:inputtransferselect list=""></s:inputtransferselect>-----获取form的一个输?
<s:iterator></s:iterator>-----用于遍历集合
LQ?
<s:label></s:label>-----只读的标{?
MQ?
<s:merge></s:merge>-----合ƈ遍历集合出来的?
OQ?
<s:optgroup></s:optgroup>-----获取标签l?
<s:optiontransferselect doubleList="" list="" doubleName=""></s:optiontransferselect>-----左右选择?
PQ?
<s:param></s:param>-----为其他标{提供参?
<s:password></s:password>-----密码输入?
<s:property/>-----得到'value'的属?
<s:push value=""></s:push>-----value的值push到栈?从而property标签的能够获取value的属?
RQ?
<s:radio list=""></s:radio>-----单选按?
<s:reset></s:reset>-----重置按钮
SQ?
<s:select list=""></s:select>-----单选框
<s:set name=""></s:set>-----赋予变量一个特定范围内的?
<s:sort comparator=""></s:sort>-----通过属性给list分类
<s:submit></s:submit>-----提交按钮
<s:subset></s:subset>-----为遍历集合输出子?
TQ?
<s:tabbedPanel id=""></s:tabbedPanel>-----表格?
<s:table></s:table>-----表格
<s:text name=""></s:text>-----I18n文本信息
<s:textarea></s:textarea>-----文本域输入框
<s:textfield></s:textfield>-----文本输入?
<s:token></s:token>-----拦截?
<s:tree></s:tree>-----?
<s:treenode label=""></s:treenode>-----?wi)的l构
UQ?
<s:updownselect list=""></s:updownselect>-----多选择?
<s:url></s:url>-----创徏url
2.Framework的概?br />
框架是h们用于解决相同或者相似类型问题的Ҏ(gu)
特点Q可重用性,可扩展性,可收~性。基于请求响应(request-responseQ模式的应用Framework的逻辑l构
控制器:(x)Controller
业务逻辑层:(x)Business Logic
数据逻辑层:(x)Data Logic
3.Struts的概念和体系l构
Struts是Apachel织的一个开源项目,主要是采用Servlet和JSP技术来实现?br />
Struts是一个基于Sun JavaEEq_的MVC框架Q它采用MVC模式Q将MVC模式分离昄逻辑和业务逻辑的能力,发挥的淋漓尽?br />
(Struts is a flexible control layer based on standard technologies like Java Servlets,JavaBeans,ResourceBundles,and XML,as well as various Jakarta Commons packages,like BeanUtils and Chain of Responsibility.The frameword helps you create an extensible developmnt environment for your application,based on published standards and proven design patterns)
4.Struts的实跉|?br />
步骤一Q搭建环?br />
a.导入jar包,使用其中的类
b.建立一个配|文Ӟstruts=config.xml
方便struts用户使用
一般在WEB=INF?br />
c.修改web.xml
注册struts中心(j)控制?--ActionServlet
步骤二:(x)建立ActionForm
步骤三:(x)建立Action
建立一个类Q承ActionQ覆盖executeҎ(gu)
注册Q修攚w|文件struts-config.xml
pathQ指明调用者(jspQ能通过中心(j)控制器ActionServlet扑ֈ该Action
typeQ指明该actioncd?br />
nameQ该action引用的form的名U?/p>
步骤四:(x)面讉K
5.Struts的工作原?br />
6.Struts的组?br />
7.Struts的配|文件简?br />
8.Struts标记?br />
9.异常处理框架
10.校验框架
11.高Ҏ(gu)?br />
12.Struts优缺?br />
优点Q?br />
Struts跟Tomcat、Turbine{诸多Apache目一P是开源YӞq是它的一大优炏V开发者能更深入的?jin)解其内部实现机制。除此之外,Struts的优点主要集中体现在两个
斚wQTaglib和页面导航。Taglib是Struts的标记库Q灵zd用,能大大提高开发效率。另外,q前国内的JSP开发者而言Q除?jin)用JSP自带的常用标记外Q很开发自q?/p>
讎ͼ或许Struts是一个很好的L(fng)?br /> 关于面DQ我们认为那是今后的一个发展方向,事实上,q样做,使系l的脉络更加清晰。通过一个配|文Ӟ卛_把握整个pȝ各部分之间的联系Q这对于后期的维
护有着莫大的好处。尤其是当另一批开发者接手这个项目时Q这U优势体现得更加明显?/p>
~点Q?br /> Taglib是Struts的一大优势,但对于初学者而言Q却需要一个持l学?fn)的q程Q甚臌?sh)(x)打乱我们网늼写的习(fn)惯Q但是,当我们习(fn)惯了(jin)它时Q我们会(x)觉得它真的很?/p>
StrutsMVC的Controller一分ؓ(f)三,在获得结构更加清晰的同时Q也增加?jin)系l的复杂度。毫无疑问,要理?Struts 必须接受一定的培训。随着变化的不断加入,q有时会(x)令h
很沮丧?br /> Struts从生到现在q(sh)q?-4q时_(d)已逐步来多q用于商业Y件。虽然它现在q有不少~点Q但它是一U非怼U的J2EE MVC实现方式Q如果我们的pȝ准备采用
J2EE MVC架构Q那么,不妨考虑一下Struts?br /> Struts 是一U基?Web ?MVC 解决Ҏ(gu)Q所以必ȝ HTML、JSP 文g?servlet 来实现它QStruts 需要支?JSP 1.1 ?Servlet 2.2 规范?servlet 容器。学?fn)、理
解和掌握Struts是我们每个基于J2EE软g开发h员(sh)门必修的评Q也是我们对企业J2EE技术应用的q一步深化?/p>
/************************************************************************************************/
Struts的基本组件包
org.apache.struts.action
基本上,控制整个struts framework的运行的核心(j)cR组仉在这个包中,比如我们上面提到的控制器ActionServlet。已lAction,ActionForm,ActionMapping{等。struts1.1?.0多了(jin) DynaActionForm cR增加了(jin)动态扩展生成FormBean功能
org.apache.struts.actions
q个包是主要作用是提供客L(fng)httph和业务逻辑处理之间的特定适配器{换功能,?.0版本中的部分动态增删FromBean的类Q也在struts1.1中被Action包的DynaActionFormlg所取代
org.apache.struts.config
提供寚w|文件struts-config.xml元素的映。这也是sturts1.1中新增的功能
org.apache.struts.util
StrtutsZ(jin)更好支持web application的应用,体统?jin)一个些常用服务的支持,比如Connection Pool和Message Source?br />
org.apache.struts.taglib
q不是一个包Q而是是一个客h{的集合。下面包括Bean TagsQHTML TagsQLogic TagsQNested TagsQTemplate Tagsq几个用于构建用L(fng)面的标签cR?
org.apache.struts.validator
Struts1.1 framework中增加了(jin)validator frameworkQ用于动态的配置from表单的验证?/p>
/************************************************************************************************/
核心(j)Struts cdMVC 的对?/p>
c?nbsp; 描述
ActionForward 用户指向或者视N择
ActionForm 状态改变的数据
ActionMapping 状态改变(sh)?
ActionServlet 控制器,接受用户h和状态改变,以及(qing)发出视图选择
Action 控制器的一部分Q于模型交互Q执行状态改变或状态查询,
以及(qing)告诉ActionServlet 下一个选择的视?
/************************************************************************************************/
Struts 使用一些配|文件和视图助手Qview helpersQ来沟通控制器和模?br />
ApplicationResources.properties 存储本地化信息和标签Q以使应用可以国际化
struts-config.xml 存储控制器对象的~省配置Q包括模型支持的用户指向Q状态改变,状态查?
标记库描q符 目的
struts-html.tld 扩展HTML Form的JSP标记
struts-bean.tld 扩展处理JavaBean的JSP标记
struts-logic.tld 扩展试属性值的JSP标记
/************************************************************************************************/
控制器组件的配置框架中的控制器组件是有org.apache.struts.action.ActionServletcd现的Q这个类是javax.servlet.http.HttpServletcȝ扩展?br />
ActionServlet配置Q我们需要在web.xml中声明ActionServletQƈ且将它配|成启动时进行加载。以下ؓ(f)可以配置的初始化参数Q?br />
参数 默认?nbsp; 描述
application Null 应用E序的资源集合的c?
bufferSize 4096 文g上传的缓冲区大小
config /WEB-INF/struts-config.xml 配置文g的位|和名称
content Text/html 默认的内容类?
debug 0 E序调试的?
detail 0 E序调试l节的?
factory Null 消息资源工厂Q用于国际化中解释消息资?
formBean org.apache.struts.action.ActionFormBean 装ActionForm bean信息的类的名U?
forward Org.apache.struts.action.ActionForward 装ActionForward对象信息的类的名U?
locale True 为true,在用户?x)话中存储一个本地对?
mapping Org.apache.struts.action.ActionForward 装ActionMapping信息的类的名U?
maxFileSize 250M 上传文g的最大尺?
multipartClass Org.apache.struts.action.ActionForward 处理多部分请求的cȝ名称
noCache False HTTP标头是否要设|ؓ(f)止~寸
Null True 讄为trueQ对于无效的信息关键字将q回null
tempDir 作ؓ(f)一个servlet参数提供l程序的工作目录 处理下蝲文g是用的临时工作目录
validate True 是否使用新格式的配置文g
vallidating True 是否寚w|文件进行有效性分?