1、MVC的设计模式
Model 1架构模式(基本上没有用了)
Model 1的核心是JSP文件,使用Model 1开发的项目包含大量相互独立的JSP文件和少部分JavaBean。使用Model 1进行开发时,JSP负责接收表单参数、处理业务逻辑并最终将结果返回给客户浏览器端。
Model 1的程序流程比较容易理解。用户提交信息给JSP页面,JSP接受用户提交的值并通过JavaBean连接数据库和操作数据库,然后将结果返回给用户。
缺点:
(1)在JSP中充斥着大量的Java脚本代码,后期维护起来非常麻烦;
(2)代码重用性非常差;
(3)可扩展性差,前期开发的项目如果添加新的功能是非常复杂和麻烦的。
Model 2架构模式
Model 2是通过面向对象技术实现MVC模式,从而扩展JSP/Servlet形成的一种新的架构模式。MVC中包含3个基本组成部分,分别是Model(模型)、View(视图)、Controller(控制器)。(视图部分一般采用JSP来实现,模型部分一般采用JavaBean来实现,控制器部分一般采用Servlet来实现)。
步骤:
(1)客户端请求的是控制器(Controller);
(2)控制器根据相应的请求调用相应的Model;
(3)然后控制器再把Model处理的数据交互给View;
(4)View就呈现给客户端。
优点:
(1)分工明确,耦合性降低;
(2)视图和逻辑进一步区分出来,方便维护。
三层架构和设计模式的区别:
(1)设计模式是针对响应和请求处理的;
(2)三层架构是针对架构的(三层架构充当的是MVC中的Model层)。
2、Struts 2的介绍(免费的,开源的)
Struts 2是一套针对MVC的设计模式开发的一套框架(所谓的框架是一种重复使用的解决方案)。
Struts 2 的优点(主要的优点):
(1)Struts 2与ServletAPI进行了解耦。耦合性就弱了;
(2)Struct 2提供了拦截器,使用的是AOP编程。(所谓拦截器,差不多就是说你想用就可以用上,不想用就取出来;然后AOP编程,比如现在的手机就是AOP编程,安装软件不需要去找厂家,自己装上就行,对你的手机也没有影响);
3、开发Struts 2的应用程序
(1)需要下载Struts 的jar包
下载地址:http://struts.apache.org/
直接点击DownLoad,找到自己想要的版本,比如我下载的是2.3.32版本(图文不符,只是举个例子,下载Full Distribution那个zip文件):
(2)Struts 2文件夹的文件介绍
。1. apps 目录:Struts 2提供的示例应用;
。2. docs 目录:Struts 2文档;
。3. lib 目录:jar库;
。4. src 目录:源程序。
(3)开发需要用到的jar包(在lib文件夹下找一下)
注意:如果实在不知道拷那些jar包,可以从apps文件夹里面解压一个示例,然后找到lib文件夹,文件夹下的jar包拷过去就可以了。
之后把jar文件都放到你新建的Web Project项目下的WEB-INF的lib下。
示例中的jar包都是需要的,不过以后开发需要的话也可以引入更多的jar包。
(4)Struts处理的时候,所有的内容都要进入到Controller(是Struts提供的控制器),可以通过过滤器实现。
如果不知道过滤器怎么配置,其实有一个很简单的方法,就是去apps中解压的示例中看web.xml。
将下面这段代码拷到自己创建的项目的web.xml中,这样可以避免出错:
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
如下:
拓展:图中那个红色框框里面的东西表示使得你转入到它自己的处理模式下。
怎么实现的:就是通过过滤器类通过一些反射手段从struts.xml找到类来处理。 -->过滤器类-->*.action-->struts.xml
(5)配置struts.xml(将struts的控制器类和路径进行一个匹配,有点类似于之前所做的servlet的配置)
struts.xml是配置在src目录下的。(因为在处理的时候他要通过在源码当中去找他的类以及他的匹配路径来处理)
所有的配置都是写在package标签中:
如下:
<package name="default" namespace="/" extends="struts-default"> <action name="login" class="com.dorra.action.LoginAction"> <result name="success">/login.jsp</result> </action> </package>
(6)在action层编写控制器类,LoginAction控制类:
3、开发Action的方式
(1)直接采用的是普通的java类开发。只需要编写一个execute的方法,在这个方法里具有一个String的返回值。
public String execute(){ return "success"; }
(2)继承自Action接口的开发
package com.dorra.action; import com.opensymphony.xwork2.Action; public class LoginAction implements Action{ @Override public String execute() throws Exception { // TODO Auto-generated method stub return "success"; } }
(3)继承自ActionSupport(推荐使用的开发方式),并且ActionSupport是在struts中如果没有配置对应的action类,那么struts默认就会调用这个ActionSupport这个类去处理。
package com.dorra.action; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport{ @Override public String execute() throws Exception { // TODO Auto-generated method stub return "success"; } }
4、如何把jsp页面的数据传给action处理
(1)采用的是action的属性传递,传递过来的参数名必须是action的属性名(要求名字必须一致)。
login.jsp
<form name="form1" method="post" action="login.action"> <div id="container"> <div id="bd"> <div class="login"> <div class="login-input"> <p class="user"> <label>用户名</label> <input type="text" name="username"> </p> <p class="password"> <label>密 码</label> <input type="password" name="userpwd"> </p> </div> <div class="login-btn"> <a href="javascript:confirmLogin();" class="btn">登录</a> <div class="remember"> <input type="checkbox" id="remember"> <em></em> <label for="remember">记住密码</label> </div> </div> </div> </div> </div> </form>
struts.xml
<package name="default" namespace="/" extends="struts-default"> <action name="login" class="com.dorra.action.LoginAction"> <result name="success">/index.jsp</result> </action> </package>
LoginAction.java
package com.dorra.action; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport{ private String username; private String userpwd; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getUserpwd() { return userpwd; } public void setUserpwd(String userpwd) { this.userpwd = userpwd; } @Override public String execute() throws Exception { // TODO Auto-generated method stub return "success"; } }
(2)采用实体属性传递
先创建一个实体对象:
package com.dorra.model; public class User { private String username; private String userpwd; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getUserpwd() { return userpwd; } public void setUserpwd(String userpwd) { this.userpwd = userpwd; } }
在action类中创建该实体对象的属性:
package com.dorra.action; import com.dorra.model.User; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport{ private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String execute() throws Exception { // TODO Auto-generated method stub System.out.println("username:" + this.user.getUsername() + ",userpwd:" + this.user.getUserpwd()); return "success"; } }
在JSP页面表单里,每个表单对象的名字为: 该实体属性.属性值
、、、、、修改LoginAction.java
、、、、、修改struts.xml
5、如何把action数据传入到JSP