3.3.3
Struts2的传值分为两种:直接字段,利用对象。
如果是字段的话,form中这么写 <s:textfield name="user" />
如果是对象的话,假设Action中有对象User user(含user和pass两个字段) ,则form中要这么些:
<s:textfield name="user.user" />
一定不能落下,不然会出错(input 未定义,类似的错误吧)
3.3.4
获得Session、Application的方法有两种:一是用ActionContext,二是用*Aware接口
对于方法一:ActionContext可以获得Session,Parameter,Application
ServletActionContexct可以获得request,response。
片段1:用ActionContext获得Session对象,并添加其值对:haha=传入的user
public String execute()
{
if(user == null || user.equals(""))
{
return "ERROR";
}
else
{
ActionContext ac = ActionContext.getContext();
Map<String,Object> session = ac.getSession();
session.put("test", user);
ac.setSession(session);
return "OK";
}
}
片段2:通过RequestAware接口实现,查询ip并显示到结果视图
package actions;
import com.opensymphony.xwork2.ActionSupport;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.interceptor.ServletRequestAware;
public class ServletAction2 extends ActionSupport implements ServletRequestAware
{
ServletRequest request;
public String execute()
{
request.setAttribute("ip", request.getRemoteHost());
return "OK";
}
public void setServletRequest(HttpServletRequest arg0)
{
request = arg0;
}
}
结果视图:
<%@page contentType="text/html" pageEncoding="GBK"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>JSP Page</title>
</head>
<body>
<h1>IP地址:</h1>
ip=<s:property value="#request.ip"/>
</body>
</html>
3.4 Action的结果为String,但其转向的视图,可以为不同类型:
<result name="返回的值" type="下述视图类型"></result>
默认的为dispatcher:传递所有参数,状态到下一页,不改变浏览器地址
chain:继续跳转到另外的action链上执行
还可以redirect:直接跳转到目标视图
另外freemaker可以结合模板使用
配置如下(struts2.xml):
<action name="redirectAction" class="action.RedirectAction">
<result name="OK" type="redirect">http://www.bjtu.edu.cn</result>
<result name="ERROR">/jsp/error.jsp</result>
</action>
如红色位置所示。。
3.5 struts.properties配置
即设定struts2的一些常量,属于全局配置。如果只针对某个项目设定,可以在其对应的struts.xml中通过<constant>进行个别配置。
一个默认的上述配置在struts2-core-2.1.6.jar的默认包中
3.6 struts.xml配置详解
3.6.2 引用
<struts>
<include file="xxx.xml" />
</struts>
3.6.3 常量
用于配置3.5中所述的各个property
例如要传递中文参数时候:
<constant name="struts.i18n.encoding" value="GBK" />
但是我发现,貌似不用也没什么事。
3.6.4 package 包标签
与Java的源代码一样,也是可以通过包来方便管理源代码间层次关系,用包把多个action组成一个整体。
<package name="default" extends="struts-default" namespace="">
<action name="checkLogin" class="actions.ValueAction">
<result name="OK">/show.jsp</result>
</action>
<action name="checkLogin2" class="actions.ValueAction2">
<result name="OK">/show2.jsp</result>
</action>
</package>
name自己起了,只要package之间name不重复就好,extends是继承自哪个struts的配置一般default,
namespace实际是url的一个上下文路径。
譬如请求的url为http://localhost:8080/app/login.action (app为应用程序的上下文路径)
则namespace可以省略或者写/
再如url为http://localhost:8080/app/jsp/login.action (app为应用程序的上下文路径)
那么namespace需要写成/jsp,这样表示这个package之下的action只处理/app/jsp/*.action,就是相当于一个层次过滤器过滤action了~
3.6.5 <action> 与 <result>
<action name="" class="" method="">
<result name="" type=""></result>
</action>
action
name:form中请求的action名称
class:处理Action的类
method:交给class中定义的Action类的哪个方法处理,如果不写,默认为execute
result
name:action中定义的method方法返回结果的匹配
type:结果视图类型,见上,默认dispatcher
3.6.6 异常 没用过,暂时忽略
3.6.7 <default-class-ref clas=""> 当某个<action>没有指定class的时候,使用这个里面指定的class
3.6.8 <default-action-ref name="xx">某个action没有映射的时候,指定默认的action
3.6.9 拦截器定义
<interceptor>
<interceptor name="" class="" />
...若干interceptor
</interceptor>
3.6.10 拦截器引用
在action中引用interceptor 使用<interceptor-ref>标签,详见下章。
3.6.11 <global-result>定义全局结果。
<package>
<global-results><result name="全局返回结果">结果对应的视图</result></global-results>
<package>