Struts2的API&數據封裝(二)

来源:https://www.cnblogs.com/bao6/archive/2019/02/12/10366554.html
-Advertisement-
Play Games

一 Servlet的API的訪問 1 完全解耦和的方式 完全看不到request、response、session。 (1)創建jsp界面 (2)編寫action (3)struts_xml 運行效果圖 調用put方法相當於往request域中存數據註意:這種方式只能獲得像 request sess ...


一 Servlet的API的訪問

1 完全解耦和的方式

 完全看不到request、response、session。

 (1)創建jsp界面

<h1>Struts2的servlet的API的訪問</h1>
<h3>完全解耦和的方式,方式一</h3>
<form method="post" action="${pageContext.request.contextPath}/requestAction.action" >
    姓名:<input type="text" name="name">
    密碼:<input type="password" name="password">
    <input type="submit" value="提交">
</form>

(2)編寫action

/**
 * 訪問servlet API的完全解耦和的方式一
 */
public class requestAction extends ActionSupport {
    public requestAction() {
        System.out.println("Action對象被創建了");
    }

    @Override
    public String execute() throws Exception {
        ActionContext actionContext=ActionContext.getContext();
        Map<String, Object> map = actionContext.getParameters();
        for (String key:map.keySet()
             ) {
           String[] values  = (String[]) map.get(key);
            System.out.println(key +"   "+Arrays.toString(values));
        }
        //存值
        actionContext.put("attName","attValue");
        actionContext.getSession().put("sessName","sessValue");
        actionContext.getApplication().put("appName","appValue");
        return SUCCESS;
    }
}

(3)struts_xml

 <action name="requestAction" class="com.itheima.demo1.requestAction">
            <result name="success" type="redirect">/demo1/demo2.jsp</result>
        </action>

運行效果圖

調用put方法相當於往request域中存數據
註意:這種方式只能獲得像 request session application集合中的值,不能操作對象的本身的方法

 


 

2 使用Servlet的API的原生方式(這種必須要會)

編寫jsp

 

<h3>使用原生的方式,方式二</h3>
<form method="post" action="${pageContext.request.contextPath}/requestAction2.action" >
    姓名:<input type="text" name="name">
    密碼:<input type="password" name="password">
    <input type="submit" value="提交">
</form>

 

編寫action

public class requestAction2 extends ActionSupport {
    @Override
    public String execute() throws Exception {
        HttpServletRequest request = ServletActionContext.getRequest();

        Map<String, String[]> map = request.getParameterMap();
        for (String key:map.keySet()
             ) {
            String[] values = map.get(key);
            System.out.println(key+"   "+Arrays.toString(values));
        }
        request.setAttribute("attName","attValue");
        request.getSession().setAttribute("sessName","sessValue11");
        ServletActionContext.getServletContext().setAttribute("appName","appValue11");
        return SUCCESS;
    }
}

運行效果圖

 

 這種方式既可以操作域中的數據,也可以操作對象的方法


 

3 介面註入的方式(這種方式很少用,瞭解)

action類

 

public class requestAction3 extends ActionSupport implements ServletRequestAware,ServletContextAware {

    private HttpServletRequest request;
    private ServletContext context;//可以通過快捷鍵來生成

    public requestAction3() {
        System.out.println("Action被創建了");
    }

    @Override
    public String execute() throws Exception {
        Map<String, String[]> map = request.getParameterMap();
        for (String key:map.keySet()
             ) {
            String[] values = map.get(key);
            System.out.println(key+""+Arrays.toString(values));
        }
        request.setAttribute("attName","attValues111");
        request.getSession().setAttribute("sessName","sessValues2");
        context.setAttribute("appName","appValues3");//存到application中
        return super.execute() ;//這裡是返回sucess,可以查看源代碼
    }

    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request=request;
    }

    @Override
    public void setServletContext(ServletContext servletContext) {
        this.context=servletContext;
    }
}

 


Servlet是單例的,只會創建一個對象。而action是多例的,每一次請求都會創建一個對象
action是線程安全的,action是多例的,在類中定義成員變數不會有線程安全的問題

 

二 配置結果頁面

1 全局結果頁面

全局結果頁面,指的是這個包底下的都有效

<global-results>
            <result name="success">/demo1/demo2.jsp</result>
</global-results>

 

2 局部結果頁面

局部結果頁面,針對當前的action有效

<action name="requestAction" class="com.itheima.demo1.requestAction">
            <result name="success" type="redirect">/demo1/demo2.jsp</result>
        </action>

 


result就是用於配置頁面的跳轉的,裡面有兩個屬性 name type

name的預設值是success,假如返回值是success就不需要寫了
type屬性:頁面跳轉的類型,前兩種類型經常用,記住
  dispacher 預設值,請求轉發,Action轉發jsp
  redirect 重定向 Action重定向jsp
  chain 轉發 ,Action轉發到Action
  redirctAction 重定向,Action重定向Action (這個案例中就用到了這個)
  stream struts2中提供文件下載的功能(瞭解)


 

 

三 數據封裝

1 方式一屬性驅動:提供set方法
 提供屬性set方法的方式 (這種方式很少用,比如文件下載,傳過來個文件名)
jsp頁面
<h1>struts2的數據封裝</h1>
<h3>方式一屬性驅動:提供set方法</h3>
<form action="${pageContext.request.contextPath}/Action1" method="post">
<s:fielderror/>
    用戶名:<input type="text" name="name"/><br>
    密碼:<input type="text" name="password" /><br>
    年齡:<input type="text" name="age"/><br>
    生日:<input type="text" name="birthday"/><br>
    工資:<input type="text" name="salary"/><br>
    <input type="submit" value="提交">
</form>
action類
/**
 * 方式一屬性驅動:提供set方法
 */
public class Action1 extends ActionSupport {
    private String name;
    private  String password;
    private Integer age;
    private Date birthday;
    private double salary;//工資
    //需要提供set方法


    public void setName(String name) {
        this.name = name;
    }

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

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String execute() throws Exception {
        System.out.println(name);
        System.out.println(password);
        System.out.println(age);
        System.out.println(birthday);
        System.out.println(salary);
        return NONE;
    }
}



方式二屬性驅動:頁面中提供表達式(可以同時向多個對象中同時封裝數據)

  在action中創建一個私有對象,提供get和set方法,一定要提供get方法
  在頁面中用user.的方式

jsp界面
<h3>方式二:屬性驅動,提供頁面表達式</h3>
<form action="${pageContext.request.contextPath}/Action2" method="post">
    用戶名:<input type="text" name="user.name"/><br>
    密碼:<input type="text" name="user.password" /><br>
    年齡:<input type="text" name="user.age"/><br>
    生日:<input type="text" name="user.birthday"/><br>
    工資:<input type="text" name="user.salary"/><br>
    <input type="submit" value="提交">
</form>

編寫action

/**
 * 二 屬性驅動:頁面中提供表達式
 */
public class Action2 extends ActionSupport {
    //創建一個私有對象,提供get和set方法,一定要提供get方法
    private User user;

    public User getUser() {        //在攔截器中獲取到user對象
        return user;
    }

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

    @Override
    public String execute() throws Exception {
        System.out.println(user);
        return NONE;
    }
}

 

方式三:採用模型驅動的方式(開發中最常用的方式)

模型驅動:只須實現一個介面,提供一個對象,頁面不用改
在action中實現模型驅動的介面(ModelDriven),後面跟上對象的泛型
使用的對象,必須手動提供對象的實例(new這個對象)
缺點:只能同時向一個對象中封裝數據(一般開發中都是同時向一個對象中封裝數據)

jsp界面

<h3>方式一:提供set方法</h3>
<form action="${pageContext.request.contextPath}/Action3" method="post">
    用戶名:<input type="text" name="name"/><br>
    密碼:<input type="text" name="password" /><br>
    年齡:<input type="text" name="age"/><br>
    生日:<input type="text" name="birthday"/><br>
    工資:<input type="text" name="salary"/><br>
    <input type="submit" value="提交">
</form>

編寫action類

**
 * 方式三:採用模型驅動的方式
 */
public class Action3 extends ActionSupport implements ModelDriven<User> {
    private User user=new User();//創建實例
    @Override
    public User getModel() {
        //實例化對象

        return user;
    }

    @Override
    public String execute() throws Exception {
        System.out.println(user);
        return NONE;
    }
}

2 封裝複雜數據到List集合中

jsp界面

<h1>struts2封裝複雜數據</h1>
<h3>封裝數據到List集合中</h3>
<form action="${pageContext.request.contextPath}/productAction1.action" method="post">
    商品名稱:<input type="text" name="products[0].name"><br>
    商品價格:<input type="text" name="products[0].price"><br>
    商品名稱: <input type="text" name="products[1].name"><br>
    商品價格: <input type="text" name="products[1].price"><br>
    商品名稱: <input type="text" name="products[2].name"><br>
    商品價格: <input type="text" name="products[2].price"><br>
    <input type="submit" value="提交數據">

</form>

編寫Action

/**
 * 封裝數據到List集合中
 */
public class productAction1 extends ActionSupport {
        private List<Product> products;

    public List<Product> getProducts() {
        return products;
    }

    public void setProducts(List<Product> products) {
        this.products = products;
    }

    @Override
    public String execute() throws Exception {
        System.out.println(products);
        return NONE;
    }
}

 

3封裝複雜數據到map集合中

jsp界面

<h3>封裝數據到Map集合中</h3>
<form action="${pageContext.request.contextPath}/productAction2.action" method="post">
    商品名稱:<input type="text" name="map['one'].name"><br>
    商品價格:<input type="text" name="map['one'].price"><br>
    商品名稱: <input type="text" name="map['two'].name"><br>
    商品價格: <input type="text" name="map['two'].price"><br>
    商品名稱: <input type="text" name="map['three'].name"><br>
    商品價格: <input type="text" name="map['three'].price"><br>
    <input type="submit" value="提交數據">
</form>

編寫Action類

**
 * 封裝數據到Map集合中
 */
public class productAction2 extends ActionSupport {
    private Map<String,Product> map;

    public Map<String, Product> getMap() {
        return map;
    }

    public void setMap(Map<String, Product> map) {
        this.map = map;
    }

    @Override
    public String execute() throws Exception {
        //遍歷Map集合
        for (String key :map.keySet()
                ) {
            Product product = map.get(key);
            System.out.println(key+"  "+product);
        }
        return NONE;
    }
}

4 寫程式時遇到的錯誤

(1)input視圖(報了input的異常,可以配一個input)
  引入一個struts2的標簽庫
  Invalid field value for field "age".
(2)jsp頁面中報element is not closed

  兩個form表單寫到了一個表單中



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • “學電腦一定要有一個非常強大的心理狀態,電腦不是黑魔法,都是人想出來的,別人能夠想的出來,那麼,總有一天,我也能夠想的出來。” 指針類型的變數就是保存地址的變數。 int* p=&i;------P是一個指針,P裡面的內容為變數i的地址,即說P指向了i; int* p,q;------註意:*號... ...
  • 很多時候我們會發現輸入的一長串內容不得不全部刪除重新輸入,這時比起一直按著退格鍵不放一個清除內容按鈕更受歡迎。 今天我將介紹三種為QLineEdit添加清除內容按鈕的方法,其中兩種方法有較強的功能針對性,另一種方法則是通用的,不僅可以用來實現清除輸入內容,還可以擴展出其他功能。 本文索引 方法1:s ...
  • os.walk(top,topdown=True,onerror=None,followlinks=False) os.walk()是python中內置(built-in)的目錄樹生成(directory tree generator)函數。 對於每一個在top目錄下的子目錄(包括top目錄本身), ...
  • 1.項目啟動類application.java類名上增加@EnableEurekaServer註解,聲明是註冊中心 1 import org.springframework.boot.SpringApplication; 2 import org.springframework.boot.autoc ...
  • 平時我們使用最多的數據結構肯定是 HashMap,但是在使用的時候我們必須知道每個鍵值對的生命周期,並且手動清除它;但是如果我們不是很清楚它的生命周期,這時候就比較麻煩;通常有這樣幾種處理方式: 由一個線程定時處理,可以是 或者 ; 利用重寫 ,實現 FIFOCache 或者 LRUCache;可以 ...
  • 題目: “一幫一學習小組”是中小學中常見的學習組織方式,老師把學習成績靠前的學生跟學習成績靠後的學生排在一組。本題就請你編寫程式幫助老師自動完成這個分配工作,即在得到全班學生的排名後,在當前尚未分組的學生中,將名次最靠前的學生與名次最靠後的異性學生分為一組。 輸入格式: 輸入第一行給出正偶數N(≤5 ...
  • C/S結構瞭解 所謂的C/S就是客戶端(client)和伺服器端(server)的簡稱,也就是在基於這個的基礎上編寫相關的代碼;一個就是客戶端一個就是服務端。 TCP(client) 客戶端編寫 因為是在Python2.7的版本所以使用該socket包 import socket 定義地址和埠 t ...
  • 本文講解了 Python 的 property 特性,即一種符合 Python 哲學地設置 getter 和 setter 的方式。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...