jar包:commons-logging-1.1.jar
freemarker-2.3.13.jar
ognl-2.6.11.jar
struts2-core-2.1.6.jar
xwork-2.1.2.jar
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
src目录下放入struts.xml
<constant name="struts.devMode" value="true" /> 改成true,为开发模式,自动启动
<package name="default" namespace="/" extends="struts-default">
<action name="hello">
<result>
/Hello.jsp
</result>
</action>
</package>
添加struts.xml自动提示功能:
window-Preferences-catalog-add
web.xml文件:
<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>
拷贝项目时注意:项目右击-Properties-MyEclipse-web-web Context-root改了
路径问题:统一使用绝对路径。(在jsp中用requestContextRoot方式来拿到webapp的路径)或者使用MyEclipse经常用的,指定basePath(在head里有个标签<base>:<base href="<%=basePath"/>)
实现一个action的最常用方式:从ActionSupport
接收参数的方法(一般用属性或者DomainModel来接受)
注意struts2的不同版本的web.xml的配置<filter-class>
动态调用:<a href="<%=context %>/user/user!add">添加用户</a>
通配符:<action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
<result>/{1}_{2}_success.jsp</result>
<!-- {0}_success.jsp -->
</action>
中文问题:最好用post提交方式
<constant name="struts.i18n.encoding" value="GBK" /> <!-- internationalization -->
struts2的标签使用:<%@taglib uri="/struts-tags" prefix="s" %>
简单数据校验:
public String add() {
if(name == null || !name.equals("admin")) {
this.addFieldError("name", "name is error");
this.addFieldError("name", "name is too long");//可以有多个错误
return ERROR;
}
return SUCCESS;
}
<s:fielderror fieldName="name" theme="simple"/>
<s:property value="errors.name[0]"/>得到下面debug中的属性的值(map中取数组的值)
<s:debug></s:debug>得到一个debug超链接
在struts.xml中使用include标签包含别的xml文件
<include file="login.xml"/>
指定默认的action:<default-action-ref name="index"></default-action-ref>
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index"></default-action-ref>
<action name="index">
<result>/default.jsp</result>
</action>
</package>
Result类型:
dispatcher 跳转到页面,不能跳转到action 地址显示的是action
redirect 跳转到页面,不能跳转到action 地址显示的是页面jsp
chain 跳转到action
redirectAction 跳转到客户端的action
result结果集:
<global-results>
<result name="mainpage">/main.jsp</result>
</global-results>
<package>包中的extends属性中可以继承包
OGNL:
<li>访问值栈中的action的普通属性: username = <s:property value="username"/> </li>
<li>访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user[\"age\"]"/> | wrong: <%--<s:property value="user[age]"/>--%></li>
<li>访问值栈中对象的普通属性(get set方法): <s:property value="cat.friend.name"/></li>
<li>访问值栈中对象的普通方法:<s:property value="password.length()"/></li>
<li>访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" /></li>
<li>访问值栈中action的普通方法:<s:property value="m()" /></li>
<hr />
<li>访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/></li>//类名加方法名
需要在struts.xml中加上一个标签:<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
<li>访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/></li>//类名加属性名
<li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li>只使用于这个类的方法这样用
<hr />
<li>访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/></li>
<hr />
<li>访问List:<s:property value="users"/></li>
<li>访问List中某个元素:<s:property value="users[1]"/></li>
<li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li>//{}代表属性的集合
<li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li>
<li>访问Set:<s:property value="dogs"/></li>
<li>访问Set中某个元素:<s:property value="dogs[1]"/></li>
<li>访问Map:<s:property value="dogMap"/></li>
<li>访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/></li>
<li>访问Map中所有的key:<s:property value="dogMap.keys"/></li>
<li>访问Map中所有的value:<s:property value="dogMap.values"/></li>
<li>访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li>
<hr />
<li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li>
<li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li>//开头
<li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li>//结尾
<li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li>
<hr />
<li>[]:<s:property value="[0].username"/></li>
freemarker-2.3.13.jar
ognl-2.6.11.jar
struts2-core-2.1.6.jar
xwork-2.1.2.jar
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
src目录下放入struts.xml
<constant name="struts.devMode" value="true" /> 改成true,为开发模式,自动启动
<package name="default" namespace="/" extends="struts-default">
<action name="hello">
<result>
/Hello.jsp
</result>
</action>
</package>
添加struts.xml自动提示功能:
window-Preferences-catalog-add
web.xml文件:
<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>
拷贝项目时注意:项目右击-Properties-MyEclipse-web-web Context-root改了
路径问题:统一使用绝对路径。(在jsp中用requestContextRoot方式来拿到webapp的路径)或者使用MyEclipse经常用的,指定basePath(在head里有个标签<base>:<base href="<%=basePath"/>)
实现一个action的最常用方式:从ActionSupport
接收参数的方法(一般用属性或者DomainModel来接受)
注意struts2的不同版本的web.xml的配置<filter-class>
动态调用:<a href="<%=context %>/user/user!add">添加用户</a>
通配符:<action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
<result>/{1}_{2}_success.jsp</result>
<!-- {0}_success.jsp -->
</action>
中文问题:最好用post提交方式
<constant name="struts.i18n.encoding" value="GBK" /> <!-- internationalization -->
struts2的标签使用:<%@taglib uri="/struts-tags" prefix="s" %>
简单数据校验:
public String add() {
if(name == null || !name.equals("admin")) {
this.addFieldError("name", "name is error");
this.addFieldError("name", "name is too long");//可以有多个错误
return ERROR;
}
return SUCCESS;
}
<s:fielderror fieldName="name" theme="simple"/>
<s:property value="errors.name[0]"/>得到下面debug中的属性的值(map中取数组的值)
<s:debug></s:debug>得到一个debug超链接
在struts.xml中使用include标签包含别的xml文件
<include file="login.xml"/>
指定默认的action:<default-action-ref name="index"></default-action-ref>
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index"></default-action-ref>
<action name="index">
<result>/default.jsp</result>
</action>
</package>
Result类型:
dispatcher 跳转到页面,不能跳转到action 地址显示的是action
redirect 跳转到页面,不能跳转到action 地址显示的是页面jsp
chain 跳转到action
redirectAction 跳转到客户端的action
result结果集:
<global-results>
<result name="mainpage">/main.jsp</result>
</global-results>
<package>包中的extends属性中可以继承包
OGNL:
<li>访问值栈中的action的普通属性: username = <s:property value="username"/> </li>
<li>访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user[\"age\"]"/> | wrong: <%--<s:property value="user[age]"/>--%></li>
<li>访问值栈中对象的普通属性(get set方法): <s:property value="cat.friend.name"/></li>
<li>访问值栈中对象的普通方法:<s:property value="password.length()"/></li>
<li>访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" /></li>
<li>访问值栈中action的普通方法:<s:property value="m()" /></li>
<hr />
<li>访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/></li>//类名加方法名
需要在struts.xml中加上一个标签:<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
<li>访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/></li>//类名加属性名
<li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li>只使用于这个类的方法这样用
<hr />
<li>访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/></li>
<hr />
<li>访问List:<s:property value="users"/></li>
<li>访问List中某个元素:<s:property value="users[1]"/></li>
<li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li>//{}代表属性的集合
<li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li>
<li>访问Set:<s:property value="dogs"/></li>
<li>访问Set中某个元素:<s:property value="dogs[1]"/></li>
<li>访问Map:<s:property value="dogMap"/></li>
<li>访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/></li>
<li>访问Map中所有的key:<s:property value="dogMap.keys"/></li>
<li>访问Map中所有的value:<s:property value="dogMap.values"/></li>
<li>访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li>
<hr />
<li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li>
<li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li>//开头
<li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li>//结尾
<li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li>
<hr />
<li>[]:<s:property value="[0].username"/></li>