- MVC 和 Struts 基本原理
(一)MVC
1.MVC 模式 MVC(Model、View、Controller),是软件开发过程中比较流行的设计思想。
在了解 MVC之前,首先明确一点,MVC 是一种设计模式(设计思想),不是一种编程技术
2.
1、纯JSP的模型架构
![cc0554e46134ac4c51380a01a26d3704.png](https://i-blog.csdnimg.cn/blog_migrate/06fdae09e5b8b7ac5cdf1cf8e9d2127b.png)
2、JSP+servlet模型架构
基于该问题,可以将这个JSP拆成三个模块来实现。
首先编写JSP,负责输入查询代码,提交到Servlet,Servlet进行安全验证,调用DAO来访问数据库,得到结果,跳转到JSP显示。
这种方法虽然前期设计比较复杂,但是有以下的特点:
A. 适合分工,每一个程序员只需要关心自己所需要关心的那个模块
B. 维护方便,例如需要修改其中的一个部分,对相应的模块进行修改就可以了
对比这两种方案,可以发现,第2种方案把程序分为不同的模块,显示、业务逻辑、过程控制都独立起来,使得软件在可伸缩性和可维护性方面有了很大的优势。
如要改变外观显示,只需要修改JSP就可以了;
修改验证方法,只需要修改Servlet就可以了;
数据库迁移只需要修改DAO就可以了,这种思想就是MVC思想
3.
MVC 思想:
(1)编写 JSP,负责输入查询代码,提交到 Servlet,
(2)Servlet 进行安全验证,调用 Dao 来访问数据库,
(3) 数据库 得到结果,跳转到 JSP 显示
4.M(Model):主要是完成数据维护,也就是数据的增删改查的操作。
封装应用程序的数据结构和事务逻辑,集中体现应用程序的状态,当数据状态改变的时候,能够在视图中体现出来,JavaBean非常适合这个角色
V(View):主要是完成向用户表达结果、表达数据,从用户那里取得用户希望执行的动作。是Model的外在表现,模型状态改变时有所体现,JSP非常适合这个角色
C(Controller):连接视图与模型之间的关系,当视图希望使用模型当中数据的时候,它会通过对模型进行一个调用,来完成数据的查询。
也就是说对用户的输入进行响应,将模型和视图联系到一起,负责将数据写到模型中,并调用视图。Java Servlet非常适合这个角色
- MVC它着重解决的问题是隔离用户界面层与数据处理层,
使得开发者在维护界面和数据处理之间的耦合度大大的降低,便于我们软件按照模块化进行开发,便于团队的合作开发,也便于我们能够提供一些成熟的成型的产品,
所以MVC设计模式在java中运用得非常多
![29429b3425ae3a6cdef060aacb25c9e6.png](https://i-blog.csdnimg.cn/blog_migrate/98dc9c3fe04085b0343c7b5e8c30e192.png)
- 工作步骤为:
(1)用户在表单中输入,表单提交给 Servlet,Servlet 验证输入,然后实例化 JavaBean
(2)JavaBean 查询数据库,查询结果暂存在 JavaBean 中
(3)Servlet 跳转到 JSP,JSP 使用 JavaBean,得到它里面的查询结果,并显示出来
- Struts框架
1.Struts 框架简介
Struts 是为了规范 MVC 开发而发布的一个框架。
类似的框架还有 WebWork、SpringMVC 等。
要编写基于Struts框架的应用,需要导入一些支持的包,也就是Struts开发包。这些开发包可以到网上去下载。下载地址为:“http://struts.apache.org/”http://struts.apache.org/
其中MyEclipse给我们提供了对struts框架的支持
- Struts 框架原理
![cda0e56380cd57aadb0ab47df74f7d47.png](https://i-blog.csdnimg.cn/blog_migrate/b6fe1d1bb3a1c3a846b21fac1f64e68d.jpeg)
![d5a1f0876d62bee96d0e7309cc4fc5fa.png](https://i-blog.csdnimg.cn/blog_migrate/76fb5e19ca5ff3f30b82cdda77c7321d.png)
![cd3cbd7ebe0683d78e8b3a0f9f5f8a10.png](https://i-blog.csdnimg.cn/blog_migrate/0fcaf3a992162df3f82cd530e3189b3b.jpeg)
对于一个动作,其执行步骤为:
(1) 用户输入,JSP 表单 提交给 ActionServlet
(2)ActionServlet 将表单信息封装在 ActionForm 内, 转交Action
(3)ActionServlet 不直接处理业务逻辑, 让 Action 来调用JavaBean(DAO)
(4)Action 返回要跳转到的JSP 页面地址 给 ActionServlet
(5)ActionServlet 进行跳转,结果在 JSP 上显示
- Struts 框架的基本使用方法
(一)导入 Struts 框架
1.MyEclipse—Project Capabilities—Add Struts Capabilities
2.Struts config path: Struts 配置文件的路径,一般不改
3. Struts specification: Struts 框架的版本。
Struts 目前比较流行的版本是 Struts1.2 或者 Struts1.3,它们风格类似;Struts2.x 也越来越流行,但是和 1.x 相比,风格具有较大的改变
4. ActionServlet name: ActionServlet 在 web.xml 配置时的名称,一般不改
5.URL pattern:调用 ActionServlet 时的路径,一般选择"*.do"
6.Base package for new classes:新建的类所放的包的名称,可以不改
7.Default application resources: Struts 资源文件的路径,使用系统默认的就可以
(二)编写 JSP
(三)编写并配置 ActionForm
1.写完JSP接下来,ActionServlet将表单提交的信息封装在ActionForm内,转交给Action。
2.此时需要编写ActionForm来容纳表单里面的数据,在包prj10内新建一个类LoginForm.java
3.ActionForm 的编写,必须要满足一定的规范:
(1)必须继承 org.apache.struts.action.ActionForm
(2) ActionForm 内可能封装的表单元素有很多,要得到它们的值,必须编写和表单元素同名的属性
- 编写并配置 Action
1.Struts框架中,要将ActionForm转交给Action来处理,Action是负责业务逻辑的。
2.要成为一个 Action,必须要满足一定的规范:
(1) 必须继承 org.apache.struts.action.Action
- 必须重写 execute 方法来处理业务逻辑
- 重写execute方法,是因为Action接收数据后,由ActionServlet自动调用它的execute方法,该方法的运行,在底层通过发射机制进行。
execute 的格式为:
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
}
后两个参数 request 和 response,是比较常见的,这两个参数是 web 容器中的内置对象。
Mapping 参数的作用是访问配置文件,
form 是传过来的 ActionForm 对象,用于得到 ActionForm 中封装的数。
ActionForward 封装跳转的目标路径
(五)程序运行的流程
1.login.jsp 中的 表单 提交到 的地址为 "/Prj10/login.do" , 提交给 ActionServlet , ActionServlet 把提交的地址中的项目名称和扩展名".do"去掉,变为"/login",读取配置文件
- 在配置文件中,根据"/login",找到配置文件中的 action 对应的类,从而得到要提交到的 LoginAction;通过 action 的 name 属性值 loginForm,找到对应的 LoginForm 类
- 将表单数据封装为一个 LoginForm 对象,提交给 LoginAction
- ActionServlet 调用 Action 的 execute 方法,处理后返回一个 ActionForward 对象给
ActionServlet ,ActionServlet 跳转到相应的页面
- 一些思考
从前面可以看出,login.jsp提交给login.do,login.do是在配置文件中出现的,ActionForm是通过name属性和LoginAction联系起来的,所以说JSP和Action的耦合度很低,它们的开发者都只要知道配置文件就可以了,另外,该框架中,技术含量最高的是ActionServlet,它可以读取配置文件,但是它的内容被框架化,在底层已经实现了,不需要程序要去编写,这样就带来了很大的方便
(七)几个问题
1. 能否不将表单数据封装到 LoginForm?
答案是可以的。可以在配置文件中,将 action 配置的 name 属性去掉,
而在 LoginAction 中使用传统的 request 得到参数值。此时,LoginAction 中得到数据的代码为:
String sname = request.getParameter("account");
(1)在配置文件中,将 action 配置的 name 属性去掉
![c6023cd0346ebea3c34dcc95a38cf12a.png](https://i-blog.csdnimg.cn/blog_migrate/b47ed1e5ab7d4539fa1807465c6a3ac7.jpeg)
- Action 中,execute 的 ActionMapping 参数有何作用?
ActionMapping 参数的作用是访问配置文件。比如, Action 中跳转到的目标发生了改变,此时如果修改 LoginAction 的源代码,比较麻烦,因此,可以将跳转目标在 配置文件中进行配置
配置文件Struts-config.xml
![ce3069d8aa5a47a3dbd6611705a7349c.png](https://i-blog.csdnimg.cn/blog_migrate/14316cbc27b510581a700b421aa25f88.jpeg)
LoginAction。java
![debc7eb9c8bd486c602cfc911eafc818.png](https://i-blog.csdnimg.cn/blog_migrate/19524a1ec6e6c7ba859493ca7388c4ec.jpeg)