Struts2到底为我们做了什么
tips:本文會不斷持續更新,直到完善為止。如有不足之處歡迎提出。
認識Struts2有一段時間了,用它做了幾個小型web應用,發現用Struts2使得開發這些小web應用變得非常簡單。這讓我變得有點茫然。如果沒有Struts2,如何開發web應用?開發web的本質是什么?Struts2存在的意義是什么?它究竟為我們做了什么?我們要拋開它天生的驕傲,還原它的本質。由于本人才學疏淺,以下探討不光是我個人見解,更多的是借鑒了廣大網友和相關書籍的經驗之談, 在此先謝過這些高手。
鳴謝:《Struts2技術內幕-深入解析Struts2架構設計與實現原理》陸舟 著
?http://www.cnblogs.com/sharpxiajun/p/3936268.html?(為什么做java的web開發我們會使用Struts2,spingMVC和sping這樣的框架?) 作者:夏天的森林
首先,先不要急著討論Struts2的本質,要先弄清楚幾個web開發的基礎概念
1.分層開發模式
從宏觀上說,web開發模式中最重要的一條是分層開發模式。分層開發模式是指,在開發J2EE程序時,將整個程序根據功能職責進行縱向劃分。一個比較典型并為大家熟知的劃分方法是將整個程序分為:表示層、業務層和持久層。
我們所熟悉的一些著名的框架,實際上就是為了解決各個開發層次的編程問題而設計的解決方案。比如說:Struts2是表示層的框架;Spring是業務層的框架;Hibernate是持久層的框架。
2.MVC模式
在分層開發模式的前提下,每一個層次都可以單獨研究,并尋找合適的解決方案和最佳實踐。對于表示層,有一種稱之為MVC的模式為廣發使用,并在此基礎上創建了許多這種模式的開發框架。
其實任何一個B/S應用的本質就是“請求--響應”的處理過程的集合體,
在這個 請求--響應 的過程中,有三大元素是必不可少的:
通過這張圖可以清楚地了解到一個web應用最基礎的業務流程。
接下來,在探討Struts2的工作本質之前,不妨忘記所謂的框架,先來研究下一個最基本的web應用的業務流程,用最本質的方式來實現一個簡單的MVC雛形,以這種方式來思考Struts2到底為表示層解決了什么樣的編程難題,難道只是實現MVC這么簡單嗎?
我們知道,Servlet的作用是接收瀏覽器傳給服務端的請求(request),并將服務端處理完的響應(response)返回給用戶的瀏覽器,瀏覽器和服務端之間通過http協議進行溝通,其過程是瀏覽器根據用戶的選擇將相關信息按http協議報文的規范組裝請求的http報文,報文通過網絡傳輸到指定的服務器,服務器通過特定的web容器接收這個報文信息,例如:tomcat,jetty,jboss這樣的web容器,web容器將http報文解析出來,如果是用戶請求,最終解析出來的報文信息會用一個request對象存儲起來,服務端使用這個request做完相應的處理后,服務端程序將結果封裝到response對象里,然后將response對象交給web容器,web容器則把這個response對象轉變為http協議的報文,并將報文回傳給瀏覽器,瀏覽器最后解析這個相應報文,將最終結果展示給用戶。
在了解以上這些后,我們以Registration(注冊)作為業務場景,我們需要一個JSP頁面來呈現用戶注冊的各個字段、一個User類來表示用戶實體以及一個RegistrationServlet類來處理注冊請求。代碼如下:
registration.jsp
<form action="/struts2_example/registration" method="post">user name:<input type="text" name="user.name" value="hnyd" />birthday:<input type="text" name="user.birthday" /><input type="submit" value="submit" /> </form>User.java
public class User {private String name;private Date birthday;public User() {}// 此處省略setter與getter方法}RegistrationServlet.java
public class RegistrationServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {<span style="color:#ff0000;">// 從request獲取參數String name = req.getParameter("name");String birthdayString = req.getParameter("birthday");// 做必要的類型轉化Date birthday = null;try {birthday = new SimpleDateFormat("yyyy-MM-dd").parse(birthdayString);} catch (Exception e) {e.printStackTrace();}// 初始化User類,并設置字段到user對象中去User user = new User();user.setName(name);user.setBirthday(birthday);</span>// 調用業務邏輯代碼完成注冊UserService userService = new UserService();userService.register(user);<span style="color:#ff0000;">req.getRequestDispatcher("/success.jsp").forward(req, resp);</span>} } 除了上述代碼外,我們還需建立起JSP頁面中的form請求與Servlet類的響應之間的關系。這一關系是在web.xml中維護的,代碼如下:
web.xml
<servlet><servlet-name>Register</servlet-name><servlet-class>com.example.web.RegistrationServlet</servlet-class></servlet><servlet-mapping><servlet-name>Register</servlet-name><url-pattern>/struts2_example/registration</url-pattern></servlet-mapping>
上面是一個簡單的用Servlet處理的業務,由于Http協議與Java數據形式的不匹配性,RegistrationServlet在數據類型轉化和實例化對象上花費了大量的精力,我們編寫了額外的代碼,把頁面上傳來的日期值轉化為Java中的Date對象。在參數的數量和Java對象越來越來復雜的情況下,這種額外的代碼就會變成一種災難,甚至成為我們開發的主要瓶頸之一。
而Struts2通過攔截器幫助我們完美的完成了以上這些和核心業務無關的工作。
在RegistrationServlet.java的最后一行,Servlet將處理過的數據重定向至success.jsp頁面,即通過硬編碼的方式完成程序執行跳轉的,這種方式不但無法支持多種新的視圖技術(模板技術、JSON數據流等等),同時也無法使我們從復雜的視圖跳轉的硬編碼中釋放出來。
解決這個問題的最有效的途徑是把不同的視圖技術進行分類,然后針對不同的視圖類別封裝不同的視圖跳轉邏輯。Struts2就是這么做的,Struts2通過配置文件來進行區分并實現不同的視圖跳轉。
即:Struts2是一個運行于web容器的表示層框架,其核心作用是幫助我們處理Http請求
Struts2處理Http請求(Request),并進行內部處理,再進行Http返回。?
總而言之,Struts2幫我們解決了我們需要和Http打交道的眾多繁瑣的工作,這也是Struts2作為分層開發模式中表現層的核心所在。
(未完待續)
總結
以上是生活随笔為你收集整理的Struts2到底为我们做了什么的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机组成原理问题集合
- 下一篇: 如何制作通讯录vcf_批量信息从表格导入