写的太好,忍不住转载了,转自:原文链接

认识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 {  @Override  protected void doPost(HttpServletRequest req, HttpServletResponse resp)  throws ServletException, IOException {  //从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);  req.getRequestDispatcher("/success.jsp").forward(req, resp);}
}  

除了上述代码外,我们还需建立起JSP页面中的form请求与Servlet类的响应之间的关系。这一关系是在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作为分层开发模式中表现层的核心所在。

从web层运作流程认识Struts2相关推荐

  1. JAVA秒杀mysql层实现_Java高并发秒杀API之web层

    第1章 设计Restful接口 1.1前端交互流程设计 1.2 学习Restful接口设计 什么是Restful?它就是一种优雅的URI表述方式,用来设计我们资源的访问URL.通过这个URL的设计,我 ...

  2. 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

    2019独角兽企业重金招聘Python工程师标准>>> 今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制 ...

  3. OAuth2基本概念和运作流程

    OAuth2基本概念和运作流程 OAuth(开放授权)是一个关于授权的开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方 ...

  4. 【华为云技术分享】解析数据治理在过程可信变革中的运作流程

    摘要:本文针对"数据牵引改进,工具固化规范"这一思路在业务团队落地过程中的动作流程进行详细阐述,并明确了支撑整个流程的关键角色定义和组织运作形式. 目的 为实现云服务开发的过程可信 ...

  5. Java高并发秒杀API(三)之Web层

    Java高并发秒杀API(三)之Web层 1. 设计前的分析 Web层内容相关 前端交互设计 Restful规范 SpringMVC Bootstrap + jQuery 前端页面流程 详情页流程逻辑 ...

  6. web项目启动流程分析

    在web项目的启动过程中,我们希望知道它的一般流程是什么,这样我们就可以在各个流程中加入相应的功能,或者对于我们排错也有帮助. 我们知道,当我们启动tomcat容器以后,容器首先初始化一些必要的组件, ...

  7. 从零开始编写自己的C#框架(16)——Web层后端父类

    从零开始编写自己的C#框架(16)--Web层后端父类 原文:从零开始编写自己的C#框架(16)--Web层后端父类 本章节讲述的各个类是后端系统的核心之一,涉及到系统安全验证.操作日志记录.页面与按 ...

  8. 接入层的流程和非接入层

    所谓接入层的流程和非接入层的流程,实际是从协议栈的角度出发的.在协议栈中,RRC和RANAP层及其以下的协议层称为接入层,它们之上的MM.SM.CC.SMS 等称为非接入层.简单地说,接入层的流程,也 ...

  9. travis ci_如何使用Travis CI和GitHub进行Web开发工作流程

    travis ci by Vijayabharathi Balasubramanian 通过Vijayabharathi Balasubramanian 如何使用Travis CI和GitHub进行W ...

  10. 简述 OAuth 2.0 的运作流程

    本文将以用户使用 github 登录网站留言为例,简述 OAuth 2.0 的运作流程. 假如我有一个网站,你是我网站上的访客,看了文章想留言表示「朕已阅」,留言时发现有这个网站的帐号才能够留言,此时 ...

最新文章

  1. 【ArcGIS for Android】基于位置查询Graphic和Feature
  2. java快速查找算法_Java实现的快速查找算法示例
  3. Stream Part.4
  4. SQL Server报错:选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中...
  5. java连接Redis数据库
  6. 图形模式下“文章伪原创工具”出汉字来
  7. getallheaders函数在服务器报500错误_C语言服务器编程必备常识
  8. exchange服务器磁盘性能,如何解决Exchange磁盘空间问题
  9. 如何使用计算机中的导出,(excel在电脑的哪个文件里?)excel怎么把查找的导出
  10. python函数定义及调用-python函数基础(函数的定义和调用)
  11. 2021年安全生产模拟考试(特种作业低压电工模拟考试题库二)
  12. 只能用于文本与图像数据?No!看TabTransformer对结构化业务数据精准建模 ⛵
  13. TARA-基于J3061的概念阶段流程
  14. 一文了解间隙配合、过盈配合、过渡配合的特点、区别及适用范围
  15. curry函数(柯里化)
  16. 163邮箱的登陆页面是什么样的有几种登陆方式?163邮箱手机版登陆
  17. iPhone入门知识普及(新手必看)
  18. 宠物之家(宠物模块)
  19. 【AWS云从业者基础知识笔记】——模块10:云计算之旅
  20. 算法复杂度分析中的符号(Θ、Ο、ο、Ω、ω)的意义

热门文章

  1. 2021年电力电缆作业考试题库
  2. sqluldr2支持mysql吗_sqluldr2工具使用方法
  3. 身份证前6位对应的省市区县
  4. 如何部署服务器虚拟化,vmware服务器虚拟化方案(vmware虚拟化平台部署)
  5. plsqldev的配置
  6. 结晶器或者连铸--流场-温度场-凝固--夹杂物计算说明
  7. 分享好用的Mac系统的FTP工具和SHELL工具
  8. 读《About Face 4 交互设计精髓》22
  9. 信捷plc485通信上位机_变频器、触摸屏和PLC建立MODBUS RTU通信的方法
  10. 使用procexp.exe查看线程