国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Struts2到底為我們做了什么

tips:本文會(huì)不斷持續(xù)更新,直到完善為止。如有不足之處歡迎提出。

認(rèn)識(shí)Struts2有一段時(shí)間了,用它做了幾個(gè)小型web應(yīng)用,發(fā)現(xiàn)用Struts2使得開發(fā)這些小web應(yīng)用變得非常簡單。這讓我變得有點(diǎn)茫然。如果沒有Struts2,如何開發(fā)web應(yīng)用?開發(fā)web的本質(zhì)是什么?Struts2存在的意義是什么?它究竟為我們做了什么?我們要拋開它天生的驕傲,還原它的本質(zhì)。由于本人才學(xué)疏淺,以下探討不光是我個(gè)人見解,更多的是借鑒了廣大網(wǎng)友和相關(guān)書籍的經(jīng)驗(yàn)之談, 在此先謝過這些高手。

鳴謝:《Struts2技術(shù)內(nèi)幕-深入解析Struts2架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)原理》陸舟 著

 http://www.cnblogs.com/sharpxiajun/p/3936268.html (為什么做java的web開發(fā)我們會(huì)使用Struts2,spingMVC和sping這樣的框架?) 作者:夏天的森林

首先,先不要急著討論Struts2的本質(zhì),要先弄清楚幾個(gè)web開發(fā)的基礎(chǔ)概念

1.分層開發(fā)模式

從宏觀上說,web開發(fā)模式中最重要的一條是分層開發(fā)模式。分層開發(fā)模式是指,在開發(fā)J2EE程序時(shí),將整個(gè)程序根據(jù)功能職責(zé)進(jìn)行縱向劃分。一個(gè)比較典型并為大家熟知的劃分方法是將整個(gè)程序分為:表示層、業(yè)務(wù)層和持久層。




我們所熟悉的一些著名的框架,實(shí)際上就是為了解決各個(gè)開發(fā)層次的編程問題而設(shè)計(jì)的解決方案。比如說:Struts2是表示層的框架;Spring是業(yè)務(wù)層的框架;Hibernate是持久層的框架。

2.MVC模式

在分層開發(fā)模式的前提下,每一個(gè)層次都可以單獨(dú)研究,并尋找合適的解決方案和最佳實(shí)踐。對(duì)于表示層,有一種稱之為MVC的模式為廣發(fā)使用,并在此基礎(chǔ)上創(chuàng)建了許多這種模式的開發(fā)框架。

其實(shí)任何一個(gè)B/S應(yīng)用的本質(zhì)就是“請(qǐng)求--響應(yīng)”的處理過程的集合體,

在這個(gè) 請(qǐng)求--響應(yīng) 的過程中,有三大元素是必不可少的:

  1. 數(shù)據(jù)模型——Model
  2. 對(duì)外交互——View
  3. 程序的執(zhí)行和控制——Control
下面圖是我根據(jù)一副流行了很多年講述MVC模型的圖制作的,幫助大家理解MVC模型:




通過這張圖可以清楚地了解到一個(gè)web應(yīng)用最基礎(chǔ)的業(yè)務(wù)流程。


接下來,在探討Struts2的工作本質(zhì)之前,不妨忘記所謂的框架,先來研究下一個(gè)最基本的web應(yīng)用的業(yè)務(wù)流程,用最本質(zhì)的方式來實(shí)現(xiàn)一個(gè)簡單的MVC雛形,以這種方式來思考Struts2到底為表示層解決了什么樣的編程難題,難道只是實(shí)現(xiàn)MVC這么簡單嗎?

我們知道,Servlet的作用是接收瀏覽器傳給服務(wù)端的請(qǐng)求(request),并將服務(wù)端處理完的響應(yīng)(response)返回給用戶的瀏覽器,瀏覽器和服務(wù)端之間通過http協(xié)議進(jìn)行溝通,其過程是瀏覽器根據(jù)用戶的選擇將相關(guān)信息按http協(xié)議報(bào)文的規(guī)范組裝請(qǐng)求的http報(bào)文,報(bào)文通過網(wǎng)絡(luò)傳輸?shù)街付ǖ姆?wù)器,服務(wù)器通過特定的web容器接收這個(gè)報(bào)文信息,例如:tomcat,jetty,jboss這樣的web容器,web容器將http報(bào)文解析出來,如果是用戶請(qǐng)求,最終解析出來的報(bào)文信息會(huì)用一個(gè)request對(duì)象存儲(chǔ)起來,服務(wù)端使用這個(gè)request做完相應(yīng)的處理后,服務(wù)端程序?qū)⒔Y(jié)果封裝到response對(duì)象里,然后將response對(duì)象交給web容器,web容器則把這個(gè)response對(duì)象轉(zhuǎn)變?yōu)閔ttp協(xié)議的報(bào)文,并將報(bào)文回傳給瀏覽器,瀏覽器最后解析這個(gè)相應(yīng)報(bào)文,將最終結(jié)果展示給用戶。

在了解以上這些后,我們以Registration(注冊(cè))作為業(yè)務(wù)場景,我們需要一個(gè)JSP頁面來呈現(xiàn)用戶注冊(cè)的各個(gè)字段、一個(gè)User類來表示用戶實(shí)體以及一個(gè)RegistrationServlet類來處理注冊(cè)請(qǐng)求。代碼如下:

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 { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { <span style='color:#ff0000;'>// 從request獲取參數(shù) String name = req.getParameter('name'); String birthdayString = req.getParameter('birthday'); // 做必要的類型轉(zhuǎn)化 Date birthday = null; try { birthday = new SimpleDateFormat('yyyy-MM-dd').parse(birthdayString); } catch (Exception e) { e.printStackTrace(); } // 初始化User類,并設(shè)置字段到user對(duì)象中去 User user = new User(); user.setName(name); user.setBirthday(birthday);</span> // 調(diào)用業(yè)務(wù)邏輯代碼完成注冊(cè) UserService userService = new UserService(); userService.register(user); <span style='color:#ff0000;'>req.getRequestDispatcher('/success.jsp').forward(req, resp);</span> }}
除了上述代碼外,我們還需建立起JSP頁面中的form請(qǐng)求與Servlet類的響應(yīng)之間的關(guān)系。這一關(guān)系是在web.xml中維護(hù)的,代碼如下:

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>

上面是一個(gè)簡單的用Servlet處理的業(yè)務(wù),由于Http協(xié)議與Java數(shù)據(jù)形式的不匹配性,RegistrationServlet在數(shù)據(jù)類型轉(zhuǎn)化和實(shí)例化對(duì)象上花費(fèi)了大量的精力,我們編寫了額外的代碼,把頁面上傳來的日期值轉(zhuǎn)化為Java中的Date對(duì)象。在參數(shù)的數(shù)量和Java對(duì)象越來越來復(fù)雜的情況下,這種額外的代碼就會(huì)變成一種災(zāi)難,甚至成為我們開發(fā)的主要瓶頸之一。

而Struts2通過攔截器幫助我們完美的完成了以上這些和核心業(yè)務(wù)無關(guān)的工作。

RegistrationServlet.java的最后一行,Servlet將處理過的數(shù)據(jù)重定向至success.jsp頁面,即通過硬編碼的方式完成程序執(zhí)行跳轉(zhuǎn)的,這種方式不但無法支持多種新的視圖技術(shù)(模板技術(shù)、JSON數(shù)據(jù)流等等),同時(shí)也無法使我們從復(fù)雜的視圖跳轉(zhuǎn)的硬編碼中釋放出來。

解決這個(gè)問題的最有效的途徑是把不同的視圖技術(shù)進(jìn)行分類,然后針對(duì)不同的視圖類別封裝不同的視圖跳轉(zhuǎn)邏輯。Struts2就是這么做的,Struts2通過配置文件來進(jìn)行區(qū)分并實(shí)現(xiàn)不同的視圖跳轉(zhuǎn)。


即:Struts2是一個(gè)運(yùn)行于web容器的表示層框架,其核心作用是幫助我們處理Http請(qǐng)求

Struts2處理Http請(qǐng)求(Request),并進(jìn)行內(nèi)部處理,再進(jìn)行Http返回。 


總而言之,Struts2幫我們解決了我們需要和Http打交道的眾多繁瑣的工作,這也是Struts2作為分層開發(fā)模式中表現(xiàn)層的核心所在。

(未完待續(xù))

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
關(guān)于大型網(wǎng)站技術(shù)演進(jìn)的思考(十四)
基于mvc模式的struts框架概述
幾種常用的Web框架簡介 - AJava
MVC基礎(chǔ)、Model2的MVC和Struts2的MVC
基于SSH的web技術(shù)介紹
SSH框架總結(jié)(框架分析+環(huán)境搭建+實(shí)例源碼下載)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服