1. 程式人生 > >【基於初學者】Struts框架

【基於初學者】Struts框架

this javax req ide doctype 存儲 ret mvc welcom

---恢復內容開始---

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     密&nbsp;碼:<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框架