马士兵struts2视频笔记--第三天

11、访问web元素  
    11.1 index.jsp
    11.2 struts.xml利用通配符调用方法    
    11.3 LoginAction1.java  
    11.4 LoginAction2.java(常用)  
    11.5 LoginAction3.java  
    11.6 LoginAction4.java  
    11.7 user_login_success.jsp 
12、模块包含和默认action    
13、Result结果类型   
    13.1 index.jsp  
    13.2 struts.xml 
14、全局结果集    
15、动态结果集    
    15.1 action方法中的处理   
    15.2 struts.xml 
16、带参数的结果集  
    16.1 index.jsp  
    16.2 struts.xml 
    16.3 UserAction.java    
    16.4 user_success.jsp
17、OGNL
18、struts标签

11、访问web元素

11.1 index.jsp

<?xml version="1.0" encoding="GB18030" ?>
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>

<% String context = request.getContextPath(); %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<title>Insert title here</title>
</head>
<body>
取得Map类型request,session,application,真实类型 HttpServletRequest, HttpSession, ServletContext的引用:
<ol>
    <li>前三者:依赖于容器</li>
    <li>前三者:IOC</li> (只用这种)
    <li>后三者:依赖于容器</li>
    <li>后三者:IOC</li>
</ol>
<br />
<form name="f" action="" method="post">
用户名:<input type="text" name="name"/>
密码:<input type="text" name="password"/>
<br />
<!-- 多个按钮提交同一个表单到不同action -->
<input type="button" value="submit1" onclick="javascript:document.f.action='login/login1';document.f.submit();" />
<input type="button" value="submit2" onclick="javascript:document.f.action='login/login2';document.f.submit();" />
<input type="button" value="submit3" onclick="javascript:document.f.action='login/login3';document.f.submit();" />
<input type="button" value="submit4" onclick="javascript:document.f.action='login/login4';document.f.submit();" />
</form>
    
</body>
</html>

11.2 struts.xml利用通配符调用方法

<?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>
    <constant name="struts.devMode" value="true" />
    <package name="login" extends="struts-default" namespace="/login">
        <action name="login*" class="com.bjsxt.struts2.user.action.LoginAction{1}">
            <result>/user_login_success.jsp</result>
        </action>
    </package>
</struts>

11.2 LoginAction1.java

package com.bjsxt.struts2.user.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
 * 依赖struts2容器
 * ActionContext.getContext()不是一个单例
* 前端可以用request、session、application对象取出
 * @author LOOK
 *
 */
public class LoginAction1 extends ActionSupport {
    private Map request;
    private Map session;
    private Map application;
    public LoginAction1() {
//Stack Content的值
        request = (Map)ActionContext.getContext().get("request");
        session = ActionContext.getContext().getSession();
        application = ActionContext.getContext().getApplication();
    }
    public String execute() {
        request.put("r1", "r1");
        session.put("s1", "s1");
        application.put("a1", "a1");
        return SUCCESS; 
    }
}

11.3 LoginAction2.java(常用)

图11-1 LoginAction2.png
package com.bjsxt.struts2.user.action;

import java.util.Map;

import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**常用
 * DI dependency injection依赖注入
* IoC inverse of control控制反转
 * @author LOOK
 *
 */
public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
    
    private Map<String, Object> request;
    private Map<String, Object> session;
    private Map<String, Object> application;
    
    public String execute() {
        request.put("r1", "r1");
        session.put("s1", "s1");
        application.put("a1", "a1");
        return SUCCESS; 
    }

    @Override
    public void setRequest(Map<String, Object> request) {
        this.request = request;//注入
    }

    @Override
    public void setSession(Map<String, Object> session) {
        this.session = session;
    }

    @Override
    public void setApplication(Map<String, Object> application) {
        this.application = application;
    }
}

11.4 LoginAction3.java

package com.bjsxt.struts2.user.action;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 基本不用
 * @author LOOK
 *
 */
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; 
    }
    
}

11.5 LoginAction4.java

package com.bjsxt.struts2.user.action;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.interceptor.ServletRequestAware;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 基本不用
 * @author LOOK
 *
 */
public class LoginAction4 extends ActionSupport implements ServletRequestAware {
    
    private HttpServletRequest request;
    private HttpSession session;
    private ServletContext application;
    
    
    
    public String execute() {
        request.setAttribute("r1", "r1");
        session.setAttribute("s1", "s1");
        application.setAttribute("a1", "a1");
        return SUCCESS; 
    }



    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
        this.session = request.getSession();
        this.application = session.getServletContext();
    }
    
}

11.6 user_login_success.jsp

<?xml version="1.0" encoding="GB18030" ?>
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
    <%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<title>Insert title here</title>
</head>
<body>
    User Login Success!
    <br />
    <s:property value="#request.r1"/> | <%=request.getAttribute("r1") %> <br />
    <s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br />
    <s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br />
    <!-- 遍历所有,查找attr中的key为a1,s1,r1的值,尽量不用 -->
    <s:property value="#attr.a1"/><br />
    <s:property value="#attr.s1"/><br />
    <s:property value="#attr.r1"/><br />
    <s:debug></s:debug>
    <br />
</body>
</html>

12、模块包含和默认action

<struts>
    <constant name="struts.devMode" value="true" />
    <!—默认:将错误输入都归到index action下 -->
    <default-action-ref name="index"></default-action-ref>
    <!—包含:协作开发时常用于将各模块的配置合并 -->
    <include file="login.xml" />
</struts>

13、Result结果类型

(1) dispatcher
(2) redirect
(3) chain
(4) redirectAction
(5) freemarker
(6) httpheader
(7) stream
(8) velocity
(9) xslt
(10) plaintext
(11) tiles
注:(1)(2)只能跳转到页面,不能跳转到action,这两个最常用
Redirect:服务器端跳转

13.1 index.jsp

<?xml version="1.0" encoding="GB18030" ?>
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>

<% String context = request.getContextPath(); %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<title>Insert title here</title>
</head>
<body>
Result类型
<ol>
    <li><a href="r/r1">dispatcher</a></li>
    <li><a href="r/r2">redirect</a></li>
    <li><a href="r/r3">chain</a></li>
    <li><a href="r/r4">redirectAction</a></li>
    <li>freemarker</li>
    <li>httpheader</li>
    <li>stream</li>
    <li>velocity</li>
    <li>xslt</li>
    <li>plaintext</li>
    <li>tiles</li>
</ol>
    
</body>
</html>

13.2 struts.xml

<?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>
    <constant name="struts.devMode" value="true" />
    <package name="resultTypes" namespace="/r" extends="struts-default">
        <action name="r1">
            <result type="dispatcher">/r1.jsp</result>
        </action>
        
        <action name="r2">
            <result type="redirect">/r2.jsp</result>
        </action>
        
        <action name="r3">
            <result type="chain">r1</result>
        </action>
        
        <action name="r4">
            <result type="redirectAction">r2</result>
        </action>
        
    </package>
</struts>

14、全局结果集

当很多action调用的结果集相同时,可以使用全局结果集,供pageage中所有action使用(方法的返回值为mainpage)。

<global-results>
            <result name="mainpage">/main.jsp</result>
</global-results>

如果两个action不在同一个包里时,

<package name="admin" namespace="/admin" extends="user">
        <action name="admin" class="com.bjsxt.struts2.user.action.AdminAction">
            <result>/admin.jsp</result>
        </action>
</package>

即:在另一个需要使用全局结果集的包里加上extends=”user”.

15、动态结果集

15.1 action方法中的处理

public String execute() throws Exception {
        if(type == 1) r="/user_success.jsp";
        else if (type == 2) r="/user_error.jsp";
        return "success";
    }

15.2 struts.xml

<!-- 用于struts配置文件中的OGNL表达式,不是EL表达式 -->
        <!-- 动态跳转到不同文件 -->
        <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
            <result>${r}</result>
        </action>   

根据r的返回值跳转到user_success.jsp或者user_error.jsp。

16、带参数的结果集

图16-1 带参数的结果集.png

16.1 index.jsp

向结果传参数
<ol>
    <li><a href="user/user?type=1">传参数</a></li>
</ol>

16.2 struts.xml

<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
            <result type="redirect">/user_success.jsp?t=${type}</result>
        </action>

16.3 UserAction.java

package com.bjsxt.struts2.user.action;

import com.opensymphony.xwork2.ActionSupport;

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

}

16.4 user_success.jsp

取出传递的参数

User Success!
    from valuestack(直接向jsp发送请求,没有经过action,所以值栈为空): <s:property value="t"/><br/>
    from actioncontext: <s:property value="#parameters.t"/>
    <s:debug></s:debug>

17、OGNL

  1. Object Graph Navigation Language
  2. 想初始化domain model,可以自己new,也可以传参数值,但这时候需要保持参数为空的构造方法
  3. 其他参考ognl.jsp
  4. 什么时候在stack中会有两个Action?chain
    ognl.jsp
<?xml version="1.0" encoding="GB18030" ?>
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<title>OGNL表达式语言学习</title>
</head>
<body>
    <ol>
        <li>访问值栈中的action的普通属性: username = <s:property value="username"/> </li>
        <li>访问值栈中对象的普通属性(get set方法)user.age:<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方法)cat.friend.name:<s:property value="cat.friend.name"/></li>
        <li>访问值栈中对象的普通方法password.length():<s:property value="password.length()"/></li>
        <li>访问值栈中对象的普通方法cat.miaomiao():<s:property value="cat.miaomiao()" /></li>
        <li>访问值栈中action的普通方法m():<s:property value="m()" /></li>
        <hr />
        <li>访问静态方法@com.bjsxt.struts2.ognl.S@s():<s:property value="@com.bjsxt.struts2.ognl.S@s()"/></li>
        <li>访问静态属性@com.bjsxt.struts2.ognl.S@STR:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/></li>
        <li>访问Math类的静态方法@@max(2,3):<s:property value="@@max(2,3)" /></li>
        <hr />
        <li>访问普通类的构造方法new com.bjsxt.struts2.ognl.User(8):<s:property value="new com.bjsxt.struts2.ognl.User(8)"/></li>
        <hr />
        <li>访问List  users:<s:property value="users"/></li>
        <li>访问List中某个元素    users[1]:<s:property value="users[1]"/></li>
        <li>访问List中元素某个属性的集合(所有user的age属性构成的集合)   users.{age}:<s:property value="users.{age}"/></li>
        <li>访问List中元素某个属性的集合中的特定值(后者常用)    users.{age}[0]|users[0].age:<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>投影(过滤)this指循环遍历中符合条件的 当前对象:<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>[]Value Stack Contents的从上往下的内容:<s:property value="[0].username"/></li>
        
    </ol>
    
    <s:debug></s:debug>
</body>
</html>

18、struts标签

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. $ # %的区别

a) $用于i18n和struts配置文件
b) #取得ActionContext的值
c) %将原本的文本属性解析为ognl,对于本来就是ognl的属性不起作用
i. 参考<s:property 和 <s:include>

其他参考文档

马士兵struts2视频笔记--第一天
马士兵struts2视频笔记--第二天
马士兵struts2视频笔记--第三天

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,924评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,781评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,813评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,264评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,273评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,383评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,800评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,482评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,673评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,497评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,545评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,240评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,802评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,866评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,101评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,673评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,245评论 2 341

推荐阅读更多精彩内容