JAVA EE 学习笔记[V4 Struts 2框架试水]
Going on
在有前面一些基础的时候可以把目光放向更远的地方了。Java EE 开发框架(刚开始接触有大佬告诉我这个是用来偷懒的,但既然存在,不可能只为偷懒)在一定程度上框架减轻了维护和开发压力,而Struts作为三大框架(还有Spring Hibernate)之一,也发展到了Struts2。要说起框架在Java EE开发过程中的地位,那如图:
若把Web应用看作是大楼,那框架则是每个房间单独的骨架,有了这个东西,建房写应用岂不美滋滋。
我在清楚的认识自己目前水平之后,理解和搞懂MVC模式下Struts框架是有一定困难的,但是使用是要掌握的。搞事:
什么是MVC模式?
MVC模式将页面功能划分为控制器controller, 模型model,视图view三部分。
Jsp负责生成动态网页,只用做显示页面(V)。
Servlet负责流程控制,用来处理各种请求的分派(C)。
JavaBeans负责业务模型,以及对数据库的操作(M)。
MVC模型的特点
视图:视图是用户与之交互的界面。视图最大的作用就是输出数据并允许用户操作,它不关心数据的处理及操作的处理等工作,这些处理操作都交由控制器来完成。
模型:在这三个部件中,模型拥有最多的处理任务。简单地说,模型部分就是对数据库的操作。模型一般被控制器调用。
由于模型的代码只写一次就可以被多个视图重用,所以减少了代码的重复性。
控制器:控制器主要接收用户的输入并调用模型和视图来完成用户的需求。它本身不输出任何东西做任何处理。
它只接收请求并决定调用哪个模型来处理请求,然后确定用哪个视图来显示模型处理返回的数据。
MVC模型的优点
低耦合性:各个模块各司其职,互不干涉,有利于开发中人员分工和组件重用。
高重用性和可适用性:随着技术的不断进步,现在需要用越来越多的方式来访问应用程序。MVC模式允许你使用各种不同样式的视图来访问同一个服务器端的代码。
可维护性:分开视图层和业务逻辑层也使得Web应用更易于维护和修改。
适合多人合作开发大型web项目 有利于软件工程化管理:
由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。
在这个模式下出现很多框架,而Struts1,Struts2,就是其中的两个框架
Struts框架的结构和工作流
(1)客户端发出请求,ActionForm封装数据,然后提交给ActionServlet。
(2)ActionServlet根据请求信息找到指定的Action,并将请求转发给Action。
(3)Action调用JavaBean(即模型)提供的业务逻辑方法处理请求,并返回ActionForward。
(4)ActionServlet根据ActionForward信息将请求转发给JSP页面。
(5)将最终页面返回给客户端。
啧啧。既然了解了工作原理图,我们继续按照惯例(依旧是熟悉的Myeclipse 2016 CI4):
我们尝试用Struts2框架:
创建完毕,我们添加框架
此时我们查看生成的xml文件:
这个人把映射位置给到了index.jsp和default.jsp,为了方便测试,我把它改为:
然后在web-root目录下我创建login.jsp:
然后写入一个登陆的demo:
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>登录页面</title> </head> <body> <form action="login.action" method="post"> <table align="center" border=1 width="300" bgcolor=#F5FFE1> <tr><td colspan="2" align="center" width="250" bgcolor="#CCCCFF">用户登录界面</td></tr> <tr><td width="50">姓名:</td><td><input type="text" name="username"/></td></tr> <tr><td width="50">密码:</td><td><input type="password" name="password" size=22/></td></tr> <tr><td align="center" colspan=2><input type="submit" value="登录" /> <input type="reset" value="重置" /></td></tr> </table> </form> </body> </html>
继续创建一个.java在src目录下:
写入登陆的控制器内容:
package org.action; public class LoginAction { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String execute(){ //不做任何判断直接返回“success” return "success"; } }
然后对Struts.xml做出以下改动:
在登陆成功之后会跳转到welcome.jsp,没有这个,继续:
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>欢迎界面</title> </head> <body bgcolor=#F5FFE1> 欢迎您!${username } </body> </html>
搞定这些东西也算一个简易的Demo制作完成
在上面这个过程执行当中完成了一下事件:
(1)浏览器请求login.jsp中表单action事件;
(2)struts容器接收到了login.action的请求,根据web.xml中的配置,服务器将包含有.action后缀的请求转到“FilterDispatcher”类进行处理,进入Struts 2的流程中。
(3)框架在struts.xml配置文件中查找名为“login”的action对应的类LoginAction。框架初始化该Action并且执行该Action类的execute方法。
(4)框架检查struts.xml以查看当返回时对应的页面。
框架告诉容器来获得请求返回的结果页面welcome.jsp,在该页面中用EL表达式输出存在值栈中的值。(这里也可以用Struts 2提供的标签来输出)
而Struts2的结构主体是Action类,以及配合该类的三层过滤器filter和配置文件struts.xml。除此以外,视图层还配合有struts专用标签库、模板库等。
由上图可得 这个过程当中没有Servlet什么事情=-=这就很尴尬了。而单纯的java类的出现也让整个程序变得低耦合高内聚了(软工老师口头禅)
Struts2框架的特点
Servlet退让!可以看出在整个流程中,没有servlet什么事。
一切都通过更强大的java类进行程序设计。避免了struts1中JSP和servlet因为耦合过于紧密,导致视图层和控制器纠缠不清的问题。
提供了对MVC的一个清晰的实现,这一实现包含了很多参与对所以请求进行处理的关键组件,如:拦截器、OGNL表达式语言。
对于一个需要经过多层处理才能返回的请求,可以 使用过滤器和拦截器一层层地实现。 OGNL表达式语言功能强大,可以代替JSTL标签库。
通过对struts2框架的试用,很明显感受到了其主体Action类的重要性=-=很明显,今天我是消化不了了。改日继续
(PS:再次致谢迪哥=-=,还有其实框架环境变量配置以及搭建蛮麻烦的,我这是沾了IDE的光)