Struts2 Learner02

 

interceptor是一個攔截器棧 看出來了嗎html

web目錄下java

---web/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--struts工做原理1 先是配置過濾器 請求過來一系列過濾器 核心是一個StrutsPrepareAndExecuteFilter(以前是FilterDispatcher)
StrutsPrepareFilter ExecuteFilter 這兩個-->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
StrutsPrepareAndExecuteFilter過濾器是這個類 注意 這是一個類 之前是FilterDispather 2.1.3開始
分了兩種StrutsPrepareFilter和ExecuteFilter 能夠在action執行以前添加本身的過濾器
</filter>

<filter-mapping>
<filter-name>struts2</filter-name>
<!-- -struts工做原理1.1 全部請求都會通過struts2的過濾器 struts2過濾本身相關的 好比.action 若是是.html .jsp就放行-->
<!-- -struts工做原理1.2 只有.action後綴的會到ActionMapper請求這裏查找 當前請求有沒有指定的action 若是有 找到以後會朝上走 回到過濾器StrutsPrepareAndExecuteFilter 而後走到ActionProxy 就像下面-->
<!-- -struts工做原理2 而後再往左邊走到ActionProxy ActionProxy經過ConfigurationManger讀 struts.xml 找到具體的action類-->
<!-- -struts工做原理3 經過ActionProxy代理建立action的一個反向的實例 再經歷一系列的攔截器執行到Action 返回一個String的Result-->
<!-- -struts工做原理4 這個Result對應的就是一個視圖 Template 包括jsp freemarker 等等 再通過一系列的攔截器 經過HttpServletResponse返回到用戶的實例進行顯示-->
<url-pattern>/'*'</url-pattern>//這裏沒辦法啊 應該就是/*的
</filter-mapping>
</web-app>

 

---web/WEB-INF/lib
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
commons-lang3-3.2.jar
commons-logging-1.1.3.jar
freemarker-2.3.22.jar
javassist-3.11.0.GA.jar
ognl-3.0.6.jar
struts2-core-2.3.24.1.jar
xwork-core-2.3.24.1.jarweb

---web/WEB-INF
---result.jspapache

<%@ page contentType = "text/html;charset=UTF-8" language = "java" %>
<html>
<head>
<title></title>
</head>
<body>
This is result.jsp
</body>
</html>

http://localhost:8080/HelloWorld/helloworld.action
能夠看到 struts2中Action的execute方法 是沒有傳入 HttpServletRequest和 HttpServletResponse對象的
@Override
public String execute() throws Exception
{
System.out.println("執行Action");
return SUCCESS;
}
struts2提供了三種方式訪問Servlet Api 1.ActionContext 2.實現***Aware接口 3.ServletActionContext

http://localhost:8080/HelloWorld/aaa/aaaa/helloworld.action這樣也能夠...這是爲何?
//若是要能夠 namespace不該該改爲/aaa/aaaa/嗎
//找到/最後一級 找到了這個action 因此沒有報錯
<package name="default" namespace="/" extends="struts-default">
<action name="helloworld" class="HelloWordAction">
//<!-- result後面能夠跟name和type的 默認的話 默認的話是SUCCESS-->
<result>/result.jsp</result>
</action>
</package>

 

這裏講一下Aciton的搜索機制
http:/localhost:8080/sturts/path1/path2/path3/student.action
第一步:判斷package是否存在,如:path1/path2/path3/
存在app

第二步:action是否存在 若是不存在則去默認namespace的package裏面尋找action
第三步:若是沒有,則報錯
不存在
第二步:檢查上一級路徑的package是否存在(直到默認namespace),重複第一步
第三步:若是沒有 則報錯jsp

3.動態方法調用
爲了解決一個Action對應多個請求的處理 以避免Action太多
方法 1.指定method屬性 2.感嘆號方式 3.通配符方式
1.指定method屬性
---HelloWordAction.javaide

public String add(){return SUCCESS;}
public String update(){return SUCCESS;}

 


---struts.xmlpost

<action name="helloworld" class="com.imooc.action.HelloWordAction">
//<!-- result後面能夠跟name和type的 默認的話 默認的話是SUCCESS-->
<result>/result.jsp</result>
</action>

<action name="addAction" method="add" class="com.imooc.action.HelloWordAction">
<result>/add.jsp</result>
</action>

<action name="updateAction" method="update" class="com.imooc.action.HelloWordAction">
<result>/update.jsp</result>
</action>

 

每一個Action xml裏面都寫一下 也很麻煩測試

2.感嘆號方式 不是很建議使用this

public String add(){return "add";}
public String update(){return "update";}

 

<action name="helloworld" class="com.imooc.action.HelloWordAction">
//<!-- result後面能夠跟name和type的 默認的話 默認的話是SUCCESS-->
<result>/result.jsp</result>
<result name="add">/add.jsp</result>
//<!-- 這裏就不能返回SUCCESS了 而是返回add-->
<result name="update">/update.jsp</result>
</action>

<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>

 

而後這麼用: http:/localhost:8080/HelloWorld/helloworld!add.action(不加!add是調到result.jsp)

3.通配符方式

<action name="helloworld_*" method="{1}" class="com.imooc.action.HelloWordAction">
//<!-- result後面能夠跟name和type的 默認的話 默認的話是SUCCESS-->
<result>/result.jsp</result>
<result name="add">/{1}.jsp</result>
//<!-- 這裏就不能返回SUCCESS了 而是返回add-->
<result name="update">/{1}.jsp</result>
</action>

 

使用方式
http:/localhost:8080/HelloWorld/helloworld_add.action
還能夠這麼寫 *_* 第一個星號是{1} 第二個是{2}
<action name="*_*" method="{2}" class="com.imooc.action.{1}Action">
這個就是在使用的時候 用大寫的helloworld
http:/localhost:8080/HelloWorld/HelloWorld_add_action.action
===============================================================================

<action name="*_*" class="org.itat.zttc.action.{1}Action" method="{2}">
<!-- class類 method方法 User-addInput User對應{1} 對應類(UserAction) addInput對應{2} 對應方法(addInput) 假設傳入User_addInput-->

<result>/WEB-INF/{1}/{2}.jsp</result>
<!-- /WEB-INF/User對應{1}/addInput.jsp對應{2}-->

<result type="redirect" name="r_list">/{1}_list.action</result>
<!-- 客戶端的跳轉 跳轉到 好比說User.Action 就是User_list.action-->
<!-- 打開User_add.action跳轉到User_list.action-->
</action>

public class UserAction
{
public String addInput()
{
System.out.println("add input");
return "success";
}

public String add()
{
System.out.println("add");
//添加完調到r_list 調用User_add以後會自動跳到User_list
return "r_list";
}

public String list()
{
System.out.println("list");
return "success";
}
}

 

==============================================================================
4.指定多個配置文件
<include file="login.xml"></include>
<include file="system.xml"></include>

5.默認action
不會出現404錯誤 會有友好的頁面
<default-action-ref name="index"></default-action-ref>
<action name="index">
<result>/error.jsp</result>
</action>

6.structs2後綴
.action改了
僞造改爲html等等 還能夠去掉!!!value=""
<constant name="struts.action.extension" value="html"></constant>

struts2包中 default.proerties 裏面有struts.action.extension=action,, 因此能夠是.action或者爲空

7.接收參數
1.使用action的屬性接收
有一點點麻煩 要寫好多action
---LoginAction.java
public class LoginAction extends ActionSupport
{
private String username;
private String password;

public String login()
{
System.out.println(username);//這個只是個測試 成功的話 後臺console會輸出用戶名
//...邏輯處理
return SUCCESS;
}
getandset方法必定要寫
}
配置
<action name="LoginAction" method="login" class="com.imooc.action.LoginAction">
<result>/success.jsp</result>
</action>
還有一個login.jsp和success.jsp 就不寫了 很簡單的

jsp中還能夠這樣寫 ${username}---${password}
!!!!!!!!!!!!!!!!!!!!!!!!!!!用struts2的標籤來寫
<s:property value="username"/>---<s:property value="password"/>

第二種方式的傳值

public String list()
{
//傳值的第一種方式 直接經過在action中設置相應的方法
this.setUsername("taojiatao");
this.setPassword("123");

//第二種方式 經過ActionContext完成值的傳遞
ActionContext.getContext().put("aaa", 12345);
ActionContext.getContext().put("bbb", 56789);

System.out.println("list");
return "success";
}

${aaa}---${bbb}
//<%--<s:property value="aaa"/>---<s:property value="bbb"/> 這個取出來全是String的
//因此取一些不是String的東西會報錯 能夠所有加# value="#aaa" 只要是ActionContext中的
//數據必定加個#
//--%>

 

2.使用Domain Model接收參數
把username和password封裝到User類中

public class User
{
private String username;
private String password;

 

public String getUsername()
{
return username;
}

public void setUsername(String username)
{
this.username = username;
}

public String getPassword()
{
return password;
}

public void setPassword(String password)
{
this.password = password;
}
}

---LoginAction.java
public class LoginAction extends ActionSupport
{
private User user;

public User getUser()
{
return user;
}

public void setUser(User user)
{
this.user = user;
}

public String login()
{
System.out.println(user.getUsername());
//...邏輯處理
return SUCCESS;
}
}

 

login.jsp
<form action="LoginAction.action" method="post">
UserName:<input type="text" name="user.username">//注意看這裏
PassWord:<input type="password" name="user.password">
<input type="submit" value="submit">
</form>

3.model driven
User.java不變

---LoginAciton.java
package com.imooc.action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class LoginAction extends ActionSupport implements ModelDriven<User>
{
private User user = new User();

public String login()
{
System.out.println(user.getUsername());
//...邏輯處理
return SUCCESS;
}

//get set方法必須去掉
@Override
public User getModel()
{
return user;
}
}

<form action="LoginAction.action" method="post">
UserName:<input type="text" name="username">
PassWord:<input type="password" name="password">
<input type="submit" value="submit">
</form>
相關文章
相關標籤/搜索