Struts2开发知识点

**struts2 之 action**


开发中实现action的方法,一般只用这种方法:

public class LoginAction extends ActionSupport { public String execute() { } }


struts2页面中一般都是用绝对路径

在页面中添加如下代码

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

然后在写路径是使用这样的格式 <a href="<%=basePath%>index.jsp"/>

或者

在head标签中添加base标签 <base href="<%=basePath%>"/> 这样在所有路径中会自动将basePath加到路径前面


动态调用acton方法,常用 !符号

例如连接中这样写...../ userAction!execute

通配符调用action *可以是任何字符

<action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">//{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>

约定优于配置

类名,方法,result页面名称,约定好的话,struts配置文件会很简单!


action中接收页面传递的参数的方式:

1>在action中 设置同名的属性,并添加set get方法,struts会自动接收并赋值,以setXXX(), getXXXX() 方法中XXXX的名称为准.

2>使用domain model 域模型 在问题域中实际存在的模型

public class UserAction extends ActionSupport { private User user; //private UserDTO userDTO; 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; } }

在jsp页面中

<a href="user/user!add?user.name=a&user.age=8">

当页面传递的参数与域模型,实体模型的属性不一一对应时,应当使用vo/do/dto模型接收页面传递的参数,处理之后根据这些模型生成实体类对象.

这里的vo/do/dto 只起到了数据传递的作用

3>模型驱动方式 ModelDriven action类implement ModelDriven<model class 例如:User>

action类中实现 public <model class> getModel()方法 { return user//这个名与action中的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; } }


**struts 传递参数是中文乱码问题的解决

<struts>

<constant name="struts.devMode" value="true" />

<constant name="struts.i18n.encoding" value="GBK" /> <!-- internationalization -->

<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>

</struts>


简单数据校验

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;

}

错误页面:

<body>

User Add Error!

<s:fielderror fieldName="name" theme="simple"/>

<br />

<s:property value="errors.name[0]"/>

<s:debug></s:debug>

</body>


在action中得到访问web元素的request,session,application对象最常用的方式

public class LoginAction3 extends ActionSupport { private HttpServletRequest request; private HttpSession session; private ServletContext application; public LoginAction3() { request = ServletActionContext.getRequest(); session = request.getSession(); application = session.getServletContext(); } public String execute() { request.setAttribute("r1", "r1"); session.setAttribute("s1", "s1"); application.setAttribute("a1", "a1"); return SUCCESS; } }


默认的action

<struts>

<constant name="struts.devMode" value="true" />

<package name="default" namespace="/" extends="struts-default">

<default-action-ref name="index"></default-action-ref>

<action name="index">

<result>/default.jsp</result>

</action>

</package>

</struts>


##Action总结##

1.实现action的最常用方式:从ActionSupport继承

2.DMI动态方法调用

3.通配符配置*_* {1}_{2}

4.接收参数的方法(!!一般使用action属性或者DomainModel来接收)

5.简单参数验证 addFieldErrro()方法

**一般不使用Struts2的UI标签,无法灵活处理错误信息

6.访问wed元素

7.包含文件配置 xml中 included 属性

8。默认action处理 struts.xml

*<default-action-ref name="actionName1">

即当无法找到对应的action时,执行actinName1这个action


**Struts2 之 Result**


Result的种类及使用:

<package name="resultTypes" namespace="/r" extends="struts-default">

<action name="r1">

<result type="dispatcher">/r1.jsp</result>//默认选项,为服务器端跳转,只能跳到html,jsp页面,不能跳到action

</action>

<action name="r2">

<result type="redirect">/r2.jsp</result>//客户端跳转,只能跳到视图,不能action

</action>

<action name="r3">

<result type="chain">r1</result>//访问action,注意前面最好不要加/,属于服务器端跳转

</action>

<action name="r4">

<result type="redirectAction">r2</result>//客户端直接跳转到action

</action>

</package>

前两个最常用!!


一包中的struts配置可以从另外一个包中继承,访问别的包的result

<struts>

<constant name="struts.devMode" value="true" />

<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>


<global-results> 所有action都可以用的result 例如错误页面跳转

<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>


带有参数的Result

struts.xml

<struts>

<constant name="struts.devMode" value="true" />

<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>

</struts>

action class
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";
}
}

***一次请求,在服务器端跳转action时,各action共享页面传递来的的参数
***当在客户端跳转,2次请求时,如果希望得到前一次请求中action中的参数,需要在result中添加参数${参数名}例如:<result type="redirect">/user_success.jsp? t=${type}</result>
注意:此时,由于传递的参数是给一个jsp页面而不是action,所有没有valueStack,访问该参数不能像访问action给jsp页面传递的参数那样从valuestack中访问,需从parameters中访问,<s:property value="#parameters.t">
或者&& <%=request.getParameters("t")%>应该也可以!

##Result总结:##

Result种类:

1.默认为dispatcher

2.redirect

以上两种常用

3.chain

4.redirectAction

全局结果集:

global-results | extends

多个action共享一个result时,使用global-results ,当希望共享其他package里的global-results时,使用extends继承那个包

动态结果集,了解即可

在action设置一个属性,保存具体的result的值location,跳转的路径.然后在配置文件中使用${将该属性得到}

传递参数

a)客户端传递才需要

b)${}表达式不是el,${}从valuestack中取值


**Struts2 之 OGNL表达式**

<title>OGNL表达式语言学习</title> </head> <body> <ol> <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> <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> </ol> <s:debug></s:debug> </body>

**Struts2 之 struts标签**

<title>Struts-Tags学习</title> </head> <body> <ol> <li>property: <s:property value="username"/> </li> <li>property 取值为字符串: <s:property value="'username'"/> </li> <li>property 设定默认值: <s:property value="admin" default="管理员"/> </li> <li>property 设定HTML: <s:property value="'<hr/>'" escape="false"/> </li> <hr /> <li>set 设定adminName值(默认为request 和 ActionContext): <s:set var="adminName" value="username" /></li> <li>set 从request取值: <s:property value="#request.adminName" /></li> <li>set 从ActionContext取值: <s:property value="#adminName" /></li> <%--<li>set 设定范围: <s:set name="adminPassword" value="password" scope="page"/></li> <li>set 从相应范围取值: <%=pageContext.getAttribute("adminPassword") %></li> --%> <li>set 设定var,范围为ActionContext: <s:set var="adminPassword" value="password" scope="session"/></li> <li>set 使用#取值: <s:property value="#adminPassword"/> </li> <li>set 从相应范围取值: <s:property value="#session.adminPassword"/> </li> <hr /> <%--<li>push:<s:set name="myDog" value="new com.bjsxt.struts2.ognl.Dog('oudy')"></s:set></li> <li> push:<s:push value="#myDog"> <s:property value="name"/> </s:push> </li> <li>push: <s:property value="name"/></li> --%> <hr /> <li>bean 定义bean,并使用param来设定新的属性值: <s:bean name="com.bjsxt.struts2.tags.Dog" > <s:param name="name" value="'pp'"></s:param> <s:property value="name"/> </s:bean> </li> <li>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"/> </li> <hr /> <li>include _include1.html 包含静态英文文件 <s:include value="/_include1.html"></s:include> </li> <li>include _include2.html 包含静态中文文件 <s:include value="/_include2.html"></s:include> </li> <li>include _include1.html 包含静态英文文件,说明%用法 <s:set var="incPage" value="%{'/_include1.html'}" /> <s:include value="%{#incPage}"></s:include> </li> <hr /> <li>if elseif else: age = <s:property value="#parameters.age[0]" /> <br /> <s:set var="age" value="#parameters.age[0]" /> <s:if test="#age < 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> </li> <hr /> <li>遍历集合:<br /> <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> <li> <s:fielderror fieldName="fielderror.test" theme="simple"></s:fielderror> </li> </ol> </body>

1.通用标签:

a>property

b>set

i.默认为action scope,会将值放入 request 和 ActionContext中

ii.page,request,session,application

c>bean

d>include(对中文文件支持有问题,不建议使用,如需包含,改用jsp包含)

e>param

f>debug

2.控制标签

a>if elseif else

b>iterator

i.collections map enumeration iterator array

c>subset

3.UI标签

a>theme

i.simple xhtml(默认) css xhtml ajax

4.AJAX标签

a>补充

5.$#%的区别

a>$用于i18n 和 struts配置文件

b>#取得ActionContext的值

c>%将原来的文本属性解析为ognl,对于本来就是ognl的属性不起作用

i.参考<s:property>和<s:include>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值