【SSH 基礎】SSH框架--struts深入詳解(二)
繼上篇部落格
既然我們知道了不使用struts給我們帶來這麼多弊端,那麼下面我們來看看struts是如何封裝的,怎麼解決我們出現的問題的?
先來說一下struts的基本流程,幫助大家理解下面的程式碼:
Struts基本簡要流程如下:
1、客戶端瀏覽器發出HTTP請求。
2、根據web.xml配置,該請求被FilterDispatcher接收。
3、根據struts.xml配置,找到需要呼叫的Action類和方法, 並通過IoC方式,將值注入給Aciton。
4、Action呼叫業務邏輯元件處理業務邏輯,這一步包含表單驗證。
5、Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,並跳轉到相應頁面。
6、返回HTTP響應到客戶端瀏覽器。
示例分析(使用struts)
配置檔案web.xml
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
add.jsp
<%@ page language="java" contentType="text/html; charset=GB2312"%> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>新增頁面</title> </head> <body> <center> <s:form action="grade"> <s:textfield name="grade.USERID" label="使用者編號" /> <s:textfield name="grade.USERNAME" label="使用者姓名" /> <s:textfield name="grade.CHINESE" label="語文成績" /> <s:textfield name="grade.MATHS" label="數學成績" /> <s:textfield name="grade.ENGLISH" label="英語成績" /> <s:submit value="確定" /> <s:reset value="重置" /> </s:form> </center> </body> </html>
Struts.xml
<package name="book" extends="struts-default">
<action name="grade" class="action.GradeAction">
<result name="show">show.jsp</result>
</action>
<action name="login" class="action.UserAction">
<result name="success">success.jsp</result>
<result name="error">error.jsp</result>
</action>
</package>
GradeAction.java
public class GradeAction {
private Grade grade;
private List<Grade> gradeList;
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
public List<Grade> getGradeList() {
return gradeList;
}
public void setGradeList(List<Grade> gradeList) {
this.gradeList = gradeList;
}
public String execute() throws Exception{
GradeDao gradeDao=new GradeDao();
gradeDao.insertGrade(grade);
ArrayList<Grade> gradeList = (ArrayList) gradeDao.listGrade();
this.setGradeList(gradeList);
return "show";
}
單純的看,這兩套程式碼(結合上篇部落格來看),從程式碼量上來看,都是完成同樣的新增功能,使用struts後,明顯程式碼量減少了許多,而且每個操作完成後的跳轉頁都配置到了配置檔案中,這樣給我們系統的維護帶來了極大的便利。它相當於從介面到action傳遞的過程中,是以物件的方式傳遞的,就不需要我們像之前的操作那樣一個欄位一個欄位的去獲取。
當然還有一點,就是struts是如何解決servlet過多的問題的?
Struts.xml
<package name="testlogin2" namespace="/user" extends="struts-default">
<action name="login" class="com.action.LoginAction2" method="doFun">
<result name="success">/success.jsp</result>
<result name="error" type="redirect">/error.jsp</result>
</action>
<!-- 第三種方式 :一個action處理多個請求 如:user/modifyUser
<action name="*User_*" class="com.action.UserManagerAction" method="{1}User">
<result name="success">/{2}.jsp</result>
<result name="error">/error.jsp</result>
</action>-->
<action name="*User" class="com.action.UserManagerAction" method="{1}User">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
public class UserManagerAction extends ActionSupport {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String addUser(){
System.out.println("---------AddUser()-------");
return "success";
}
public String modifyUser(){
System.out.println("---------ModifyUser()-------");
return "success";
}
public String delUser(){
System.out.println("---------DelUser()-------");
return "success";
}
}
與servlet的關係
前面我們說對於Model 2模型來說,Servlet過多,轉向頻繁,流程,配置等不易集中管理,那麼struts與Servlet有什麼關係?它怎麼就能解決Servlet的這些問題呢?
可以說Struts2本質還是一個Servlet,只是對Servlet進一步的封裝罷了
對於解決問題來說:
打個比方:做Web專案,好比建房子。
Servlet好比木材,用一根根的木材搭,也可蓋起房子,只是速度慢而已;
Struts2好比是用木材做好的一個房子大概結構,要建房子時,只需把它拿過來,再往其裡面添磚加瓦,修修補補,就能很快蓋好房子,這要比直接使用Servlet要快得多
以上只是我對struts的簡單理解,用一句話概括,struts就是將某些功能進行提取,然後做了一個封裝,能讓我們更好的使用(框架)。當然對於它的優勢還需要我們在以後做專案的過程中慢慢體會!
相關推薦
【SSH 基礎】SSH框架--struts深入詳解(二)
繼上篇部落格 既然我們知道了不使用struts給我們帶來這麼多弊端,那麼下面我們來看看struts是如何封裝的,怎麼解決我們出現的問題的? 先來說一下struts的基本流程,幫助大家理解下面的程式碼: Struts基本簡要流程如下: 1、客戶端瀏覽器發出HT
安卓專案實戰之強大的網路請求框架okGo使用詳解(二):深入理解Callback之自定義JsonCallback
前言 JSON是一種取代XML的資料結構,和xml相比,它更小巧但描述能力卻不差,由於它的小巧所以網路傳輸資料將減少更多流量從而加快了傳輸速度,目前客戶端伺服器返回的資料大多都是基於這種格式的,相應的我們瞭解的關於json的解析工具主要有兩個:Gson(Google官方出的)和fas
【SpringBoot學習之路】06.Springboot配置檔案詳解(二)
轉載宣告:商業轉載請聯絡作者獲得授權,非商業轉載請註明出處.原文來自 © 呆萌鍾 【SpringBoot學習之路】06.Springboot配置檔案詳解(二) 配置檔案值注入 @Value獲取值和@ConfigurationProperties獲取值比較
【AI基礎】python:openCV——處理鼠標事件(1)
python:opencv 處理鼠標 一、用戶通過鼠標對圖像視窗最常見的操作有: 左鍵單擊按下 左鍵單擊擡起 左鍵按下拖動 鼠標指針位置移動 二、單次單擊操作響應事件及順序 Opencv中setMouseCallback()創建了一個鼠標回調函數,每次在圖像上單擊鼠標左鍵再擡起的過程,
【AI基礎】python:openCV——圖像算術運算(1)
圖像算術運算圖像算術運算 1.圖像加法使用cv2.add()將兩幅圖像進行加法運算,也可以直接使用numpy,res=img1+img2.兩幅圖像的大小,類型必須一致,或者第二個圖像可以是一個簡單的標量值。openCV的加法是一種飽和操作,而numpy的加法是一種模操作。OpenCV的結果會更好 import
【AI基礎】python:openCV——圖像算術運算(2):按位運算
按位運算 openCV 按位運算 按位操作有:AND,OR,NOT,XOR 等。當我們提取圖像的 一部分,選擇非矩形 ROI 時這些操作會很有用,常用於Logo 投射。 本節操作思路:通過 threshold 函數將圖片 固定閾值二值化,定義:圖像的二值化,就是將圖像上的像素點的灰度值設置為0或25
三大框架(ssh)學習——配置檔案詳解(二)
多配置檔案實現 專案經常需要多人協作開發,但是如果大家都是用同一個struts.xml檔案,會互相影響不利於開發的正常開展。這樣,我們可以通過<include>元素指定多個配置檔案。 可以在src下面建立多個struts配置檔案。然後再struts.xml中分別引入: str
【STL深入學習】SGI STL空間配置器詳解(二)-第二級空間配置器
本文講解SGI STL空間配置器的第二級配置器。 相比第一級配置器,第二級配置器多了一些機制,避免小額區塊造成記憶體的碎片。不僅僅是碎片的問題,配置時的額外負擔也是一個大問題。因為區塊越小,額外負擔所佔的比例就越大。 額外負擔是指動態分配記憶體塊的時候,位於其頭部的額外資訊
安卓專案實戰之強大的網路請求框架okGo使用詳解(一):實現get,post基本網路請求,下載上傳進度監聽以及對Callback自定義的深入理解
1.新增依賴 //必須使用 compile 'com.lzy.net:okgo:3.0.4' //以下三個選擇新增,okrx和okrx2不能同時使用,一般選擇新增最新的rx2支援即可 compile 'com.lzy.net:okrx:1.0.2' compile 'com.lzy
【SpringBoot學習之路】08.Springboot配置檔案詳解(四)
轉載宣告:商業轉載請聯絡作者獲得授權,非商業轉載請註明出處.原文來自 © 呆萌鍾【SpringBoot學習之路】08.Springboot配置檔案詳解(四) 自動配置原理 配置檔案到底能寫什麼?怎麼寫?自動配置原理; 配置檔案能配置的屬性參照
【SpringBoot學習之路】07.Springboot配置檔案詳解(三)
轉載宣告:商業轉載請聯絡作者獲得授權,非商業轉載請註明出處.原文來自 © 呆萌鍾 【SpringBoot學習之路】07.Springboot配置檔案詳解(三) Profile多環境支援 Profile是Spring對不同環境提供不同配置功能的支援,可以通
【SpringBoot學習之路】05.Springboot配置檔案詳解(一)
轉載宣告:商業轉載請聯絡作者獲得授權,非商業轉載請註明出處.原文來自 © 呆萌鍾【SpringBoot學習之路】05.Springboot配置檔案詳解(一) 配置檔案 Spring Boot使用一個全域性的配置檔案 applic
【Mint-UI】Action sheet 用法及詳解(內含取消事件的觸發方法)
鑑於mint-ui官方文件的極簡描述和對功能介紹的點到為止,許多功能的完全實現是需要通過閱讀原始碼才可以知道其真正的用法。 今天給大家介紹一下Action sheet的用法,以及我踩過的坑,感覺比較有意義,希望能幫到各位。 效果圖: 首先我先帶大家看一下官方的介紹: act
【機器學習】資料探勘演算法——關聯規則(二),挖掘過程,Aprioir演算法
關聯規則挖掘的原理和過程 從關聯規則(一)的分析中可知,關聯規則挖掘是從事務集合中挖掘出這樣的關聯規則:它的支援度和置信度大於最低閾值(minsup,minconf),這個閾值是由使用者指定的。根據 support=(X,Y).count/T.countsupp
【Fragment】 Android Fragment生命週期詳解(圖文)
Fragment API(映象地址): Fragment/Activity生命週期圖 Fragment狀態變化常用方法 1. onHiddenChanged(boolean hidden) Activity內部通過show和hide方法切換Fragment時,引
【webpack系列】從零搭建 webpack4+react 腳手架(二)
html檔案如何也同步到dist目錄?bundle.js檔案修改了,萬一被瀏覽器快取了怎麼辦?如何為匯出的檔案加md5?如何把js引用自動新增到html?非業務程式碼和業務程式碼如何分開打包?如何搭建開發環境?如何實現開發環境的熱更新? 在上一節我們已經搭建了一個最基本的webpack環境,
【平行計算】用MPI進行分散式記憶體程式設計(二)
通過上一篇中,知道了基本的MPI編寫並行程式,最後的例子中,讓使用0號程序做全域性的求和的所有工作,而其他的程序卻都不工作,這種方式也許是某種特定情況下的方案,但明顯不是最好的方案。舉個例子,如果我們讓偶數號的程序負責收集求和的工作,情況會怎麼樣?如下圖:
【pySpark教程】Big Data, Hardware trends, and Spark(二)
Big Data, Hardware trends, and Spark 在本系列課程中,我們會學習如下內容: Data Management Semi-Structed Data Structured Data 實驗二:使用 Spark 分析
VC++深入詳解(1):MFC框架程式剖析
學了一段Win32SDK應用程式以後,因為種種雜七雜八的事情,讓windows程式設計的內容停滯了很長一段時間。但是我今天還是鼓足了勇氣,繼續開始後面的內容。(不過後面的筆記不再是跟著楊力祥老師的上課內容了,因為他對MFC的講解似乎課程剩下的不是很足,所以我換了孫鑫老師的聽
【轉】SignalR新手系列教程詳解(六)- ASP.NET 應用整合 SignalR 瀏覽器聊天室示例
在上一篇教程我們講解了SignalR 平臺配置要求,下面根據一步步詳細示例搭建一個 SignalR 的示例專案,以此瞭解 SignalR 到底是一個什麼樣的效果。 SignalR 示例所使用的軟體版本 Visual Studio 2013,當然更高的版本也是支援的。