Struts2开发者突击,第三章代码笔记

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>
 

Leave a Reply

Your email address will not be published. Required fields are marked *