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应用的本质就是“请求--响应”的处理过程的集合体,

在这个 请求--响应 的过程中,有三大元素是必不可少的:

  1. 数据模型——Model
  2. 对外交互——View
  3. 程序的执行和控制——Control
下面图是我根据一副流行了很多年讲述MVC模型的图制作的,帮助大家理解MVC模型:

通过这张图可以清楚地了解到一个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到底为我们做了什么相关推荐

  1. 到底能不能做一辈子的程序员——大龄程序员将何去何从

    目录 写在前面 做一辈子的技术到底好不好 迷茫 求大佬指点迷津 写在前面 今天面试一家银行科技部被拒绝了,原因并不是因为自己的技术烂,而是因为-- 自己缺乏银行从业经验. 做java开发快三年了,看过 ...

  2. pycharm里怎么关闭一个项目_【周末分享】一个完整的项目复盘到底要怎么做?...

    点击"阅读原文",注册会员,海量活动方案免费拿 作者 | 杨阳(广告创意主笔) 来源 | 广告创意(ID:idea1408) 字数:3099 推荐阅读时长:5min 从计划到执行到 ...

  3. 灵魂拷问:用移位来代替除法运算真的效率高吗?Java 编译器到底有没有做除法优化?

    目录 引入 C++ 编译器对除法的优化 Java 编译器对除法的优化 移位运算对应的字节码 除法操作对应的字节码 查看及分析 JIT 即时编译结果 1.手动编译 OpenJDK 2.编译 hsdis- ...

  4. 90%的人都做错的用户画像,到底应该怎么做?

    前几天,有个搞运营的小伙伴向我吐槽,熬了几个夜做出来的用户画像被老板说垃圾.不管是市场人员.运营人员还是产品经理,都躲不开"用户画像",但经常听到伙伴们抱怨,这个词太大了,根本不知 ...

  5. 视频书单号到底好不好做,能不能赚钱?

    抖音视频书单号到底好不好做,还能不能赚钱?任何一个项目,有成功的人,也有失败的人,成功的人可能不会告诉你这个项目好做,更多可能也会告诉你这个项目不好做.而失败的人会告诉你,这个项目不好做,这个理由很简 ...

  6. 普通人学会Python到底具体能做什么呢?

    为什么那些教Python课程的人不用Python去做技术赚钱? 就像顶级的运动员们都会有很多训练师指导他们训练,训练师们具备专业知识.专业技能,却不会自己上场比赛,原因有二:其一是黄金年龄段已经过了, ...

  7. 运维工程师到底都在做些什么?

    我们群里最近讨论500台服务器安装系统的问题.我特意找了一篇高人写的文章来与大家分享,希望对大家能有所帮助哈!(以下为作者原文,未加任何修改哈) 看到chinaunix最近出的门户网站运维板块veyr ...

  8. 医院网络营销到底该怎么做

    医院网络营销到底该怎么做?作为混迹医疗网络营销界数十载的江湖混混,可能我并无发言权,因为我手中的权杖分量还不够.阅读了太多的武林秘密,瞻仰了很多医疗界所谓大师的杰作,什么<葵花宝典>.&l ...

  9. C++到底还能做什么? ----感觉说的还是很有道理的,共勉!

    C++到底还能做什么? 肖舸 嗯,这是一位朋友发到我邮箱里面的,很奇怪,发到了gmail邮箱,而不是我常用的hotmail邮箱哈.  我呢,试着回答一下,如果回答得不好,叫做肖某人学艺不精,回去重新学 ...

  10. C++到底还能做什么?

    肖舸:C++到底还能做什么? 嗯,这是一位朋友发到我邮箱里面的,很奇怪,发到了gmail邮箱,而不是我常用的hotma il邮箱哈. 我呢,试着回答一下,如果回答得不好,叫做肖某人学艺不精,回去重新学 ...

最新文章

  1. pom文件中引入常用的maven仓库
  2. Mac vscode 调试打印有问题 输出缓冲区 “\r\n“
  3. 学习笔记-Redis设计与实现-跳跃表
  4. MY MOBILER v1.23 - 类似SOTI Pocket Controller的免费工具
  5. vb microsoft.xmlhttp 获取所有超链接_编写我的第一个VB程序
  6. 手机怎么打开f12_碰到生僻字看不懂怎么办?打开手机这个开关,一键即可秒懂...
  7. 迅为IMX6Q PLUS开发板烧写Android6.0系统方法
  8. webpack如何全局引入jquery和echarts?
  9. C++ 函数参数中和区别
  10. 【风控建模干货分享】个推大数据金融风控算法实践
  11. [转载]淘宝技术发展
  12. 家庭多房间网线连接---小白快速上手
  13. Name was not previously introduced as per JSP.5.3的解决办法
  14. Codewars | 使用入门
  15. Vue + element-ui合并单元格后,checkbox多选单选取值问题
  16. 【2. Redis 高级数据结构】
  17. PTA - 数据库合集16
  18. 台大郭彦甫教授Matlab讲解笔记(一)
  19. 基于elementUI封装了基础表单组件
  20. word文档生成目录的方法,word生成目录之后怎么修改页码

热门文章

  1. bt磁力链接转换种子中的问题
  2. 计算机二级office树的知识,计算机二级office选择题白话串讲--二叉树,是什么树?(1)...
  3. 胶东机场t1离哪个停车场近,青岛胶东国际机场停车场攻略
  4. 微信小程序订阅服务器,微信小程序之模板订阅消息
  5. 计算机三级网络技术备考复习资料zhuan
  6. Leetcode Top100题目和答案(Java完整版 面试必备)
  7. R语言学习笔记 | R语言的入门
  8. Matlab的两种除法:左除(\)和右除(/)
  9. ecshop 模板页php,ECSHOP 模板结构说明
  10. 抖音小店都有哪些类目