【基於初學者】Struts框架
---恢復內容開始---
Struts相關知識點
Struts是什麽? 是基於MVC模式的web應用框架,它本質上相當於一個servlet
Struts的配置
在eclipse中創建一個項目 然後在當前項目中WEB-INF文件夾下的lib文件中導入有關Struts的jar文件,接著在src裏面創建一個struts.xml文件 在當前項目中找到Libraries→Web App Libraries點擊→有一個struts2-core-2.3.24.jar文件裏面有一個struts-default.xml文件點擊有一下
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
這段復制到在src裏面創建一個struts.xml文件中 接著寫配置文件 如:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5<struts> 6 <package name="mypackage" extends="struts-default"> 7 <!-- 通用符 ! login!add.action * --> 8 <action name="login*" class="com.action.LoginAction" method="{1}"> 9 <result name="success">/success.jsp</result> 10 </action> 11</package> 12 </struts>
接著在web.xml文件裏面寫個過濾器,不寫會在網頁是報個404找不到路徑的錯 web.xml文件寫 如圖:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 3 <display-name>struts01</display-name> 4 <welcome-file-list> 5 <welcome-file>index.html</welcome-file> 6 <welcome-file>index.htm</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 <welcome-file>default.html</welcome-file> 9 <welcome-file>default.htm</welcome-file> 10 <welcome-file>default.jsp</welcome-file> 11 </welcome-file-list> 12 13 <!-過濾器-> 14 <filter> 15 <filter-name>struts2</filter-name>
16 <!-Ctrl+Shift+T 輸入StrutsPrepareAndExecuteFilter->
17 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
18 </filter> 18 <filter-mapping> 19 <filter-name>struts2</filter-name>
19 <url-pattern>*.action</url-pattern>
20 </filter-mapping>
21 </web-app>
知識點一
數據封裝: 屬性封裝 模型驅動封裝 表達式封裝 (註意:在一個action中不能給對同一個表單使用屬性封裝和模型驅動封裝,如果使用只會執行模型驅動封裝)
模型驅動封裝的實現步驟:
01:創建實體類(屬性名必須和表單的name屬性值一致)
02:action實現ModelDriven接口
03:實現ModelDriven的接口的getModel方法 如:private 實體類 實體類對象名=new實體類(); public 實體類 getModel(){ return 實體類對象名;}
實體類
1 package com.entity; 2 3 public class ELogin { 4 5 public ELogin(String uname, String upassword) { 6 super(); 7 this.uname = uname; 8 this.upassword = upassword; 9 } 10 11 public ELogin() { 12 super(); 13 // TODO Auto-generated constructor stub 14 } 15 private String uname; 16 private String upassword; 17 18 public String getUname() { 19 return uname; 20 } 21 public void setUname(String uname) { 22 this.uname = uname; 23 } 24 public String getUpassword() { 25 return upassword; 26 } 27 public void setUpassword(String upassword) { 28 this.upassword = upassword; 29 } 30 31 32 }
Action類
1 public class LoginAction extends ActionSupport implements ModelDriven<ELogin> { 2 3 public String admin() { 4 System.out.println(elogin.getUname() + "_____________" + elogin.getUpassword()); 5 return NONE; 6 } 7 8 //實例化實體 9 private ELogin elogin = new ELogin(); 10 11 /** 12 * 模型驅動封裝 13 */ 14 @Override 15 public ELogin getModel() { 16 // TODO Auto-generated method stub 17 return elogin; 18 } 19 20 }
JSP頁面
1 <body> 2 <form action="loginadmin.action" method="post"> 3 用戶名:<input name="uname"> 4 密 碼:<input type="password" name="upassword"> 5 <input type="submit" value="提交"> 6 </form> 7 </body>
表達式封裝的實現步驟:
01:在Action類中聲明實體類:private 實體類 實體類對象名;
02:生成實體類對象名的set和get的方法
03:修改表單屬性值:name="實體類對象名.屬性名"(users.username)
Action類
package com.action; import com.entity.ELogin; import com.opensymphony.xwork2.ActionSupport; public class Login2Action extends ActionSupport{ public String admin() { System.out.println(elogin.getUname() + "_____________" + elogin.getUpassword()); return NONE; } /** * 表達式封裝 */ private ELogin elogin; public ELogin getElogin() { return elogin; } public void setElogin(ELogin elogin) { this.elogin = elogin; } }
講了這麽多肯定有人在想表達式封裝和模型封裝之間有什麽區別 下面就講講它們之間的區別:
表達式封裝和模型封裝的相同點以及不同點
相同點:簡單的說都可以把數據封裝到實體類中
不同點:模型驅動封裝只能夠把數據封裝到一個實體類中,在一個action裏面只能實現一次ModelDriven的接口所以模型封裝只會封裝一個到一個實體類中,而表達式封裝可以把數據封裝到多個對象中.
知識點二
OGNL表達式寫法
說道ognl表達式,我們可能會想到El表達式,對它們都是很強的表達式語言,但是El表達式在Struts1中比較常用的,Struts2則默認使用了OGNL表達式,結合Struts2的標簽庫,完成了頁面的數據綁定.說道這就給大家簡單說說Struts1和Struts2的區別
Struts1和Struts2的區別?
都是MVC的WEB框架,Struts1是一個老的框架,當應用很廣泛,有很好的群眾基礎,使用它開發風險很小,成本低,那為什麽要用Struts2呢?Struts2畢竟是站在前輩的基礎設計出來,它會改善Struts1中的一些缺陷,Struts1中一些問題在Struts2中能得到解決.
回歸正題 OGNL表達式的使用 先導入Struts2的標簽庫 <%@ taglib uri="/struts-tags" prefix="s"%> 使用標簽庫 <s:property value="‘haha‘.Length()"/>
知識點三 值棧
什麽是值棧?
Struts2裏面本身提供的一種存儲機制,類似於域對象,值棧,可以存值和取值.
action和servlet區別?
每次訪問action的時候,都會創建一個新的action對象,而servlet只能有一個對象.
怎麽獲取值棧的對象 如圖:
action類
package com.action;
import java.security.KeyStore.PrivateKeyEntry;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.entity.Person;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;
public class IndexAction extends ActionSupport{
private String name;
public String getName() {
return name;
}
@Override
public String execute() throws Exception {
// // 1 獲取值棧對象
ActionContext actionContext=ActionContext.getContext();
//v1值棧對象 存於action對象中
//每一次訪問action就會產生一個新的action對象
ValueStack v1=actionContext.getValueStack();
v1.push("PUSH的值");
v1.set("zking", "set的值");
}
}
Jsp 頁面
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ taglib prefix="s" uri="/struts-tags" %> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>Insert title here</title> 9 </head> 10 <body> 11 <s:property value="zking"/> 12 <s:debug></s:debug> 13 </body> 14 </html>
值棧的結構?root 結果是list集合 context 結果是map集合
簡單講一下struts2標簽庫+ognl表達式
基礎數據 <s:property value="放入的變量名"/>
對象 <s:property value="對象名.屬性名"/>(不要在屬性名前面加上get或者set)
List集合三種方法 第一種:<s:property value="集合變量名[下標].屬性名"/>
第二種:<s:iterator value="集合變量名">
<s:property value="集合對象的屬性名"/>
</s:iterator>
第三種:<s:iterator value="集合變量名" var="元素變量名">
<s:property value="#元素變量名.屬性名"/>
</s:iterator>
---恢復內容結束---
【基於初學者】Struts框架