Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
1.MVC 设计模式
- MVC 是 Model-View-Control 的简称,即模型-视图-控制器。它是一个存在于web应用中的表现层的模型,它将应用分开,改变应用之间的高度耦合,进行对程序的扩展性以及后期维护成本降低
- MVC 模式将应用分为模型、视图和控制器三个部分:
- 视图:数据的展现。 JSP 、 html 、 freemarker、 pdf 、 execl等
视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并能接收用户的输入数据,但是它并不进行任何实际的业务处理。视图可以向模型查询业务状态,但不能改变模型。视图还能接受模型发出的数据更新事件,从而对用户界面进行同步更新。 - 模型:应用对象(数据模型、业务模型)。 JAVABEAN( DOMAIN、S ERVCIE 包下面的java 类)
模型是应用程序的主体部分。 模型代表了业务数据和业务逻辑; 当数据发生改变时,它要负责通知视图部分;一个模型能为多个视图提供数据。由于同一个模型可以被多个视图重用,所以提高了应用的可重用性。 -
控制器:逻辑处理、控制实体数据在视图上展示、调用模型处理业务请求。 (servlet 、 filter 充当控制器)
当 Web 用户单击 Web 页面中的提交按钮来发送 HTML 表单时,控制器接收请求并调用相应的模型组件去处理请求,然后调用相应的视图来显示模型返回的数据。
Mvc模型图:
2.三层架构
所谓三层体系结构,是在客户端与数据库之间加入了一个“中间层”,也叫组件层。这里所说的三层体系,不是指物理上的三层,不是简单地放置三台机器就是三层体系结构,也不仅仅有B/S应用才是三层体系结构,三层是指逻辑上的三层,即使这三个层放置到一台机器上。 三层体系的应用程序将业务规则、数据访问、合法性校验等工作放到了中间层进行处理。通常情况下,客户端不直接与数据库进行交互,而是通过http协议和web服务器建立连接,找到程序中间层与数据库进行交互。
三层架构的优点:
优点:开发人员可以只关注整个结构中的其中某一层;
可以很容易的用新的实现来替换原有层次的实现;
可以降低层与层之间的依赖;
有利于标准化;
利于各层逻辑的复用。
缺点:
降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。
有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。增加了开发成本。
3.Struts2 历史
- 框架的理解:框架其实是一个半成品的程序,业务需求需要程序员去实现,模板性的功能及代码,框架进行了有效的封装,提高了程序员开发的效率,把更多的精力集中到了业务需求的开发上来。
- Struts2框架在属于表现层的框架(三层架构的表现层)
- Struts2框架基于MVC的设计模式实现
- Struts1与Struts2的关系:严格上来讲,Struts2不是Struts1的升级版,Struts2=Struts1+webwork的结合体,吸取两个框架的有点而形成
早期现有struts1,struts1和struts2都是apache的产品,struts1在2003年左右比较火.在当时,表现层框架有很多:webwork框架。
- Struts1 vs webwork 区别:
Struts1比较出名因为后台是apache,webwork不是很出名
Webwork框架的设计思想比较前卫(AOP),设计思想沿用至今,struts1的耦合性(servlet api)很紧密,入侵性,就导致使用struts1扩展性差
4.第一个Struts2 小程序
- 导包:
asm-5.2.jar
asm-commons-5.2.jar
asm-tree-5.2.jar
commons-fileupload-1.3.3.jar
commons-io-2.5.jar
commons-lang3-3.6.jar
freemarker-2.3.26-incubating.jar
javassist-3.20.0-GA.jar
jsp-api.jar
log4j-api-2.9.1.jar
log4j-core-2.9.1.jar
ognl-3.1.15.jar
servlet-api.jar
struts2-core-2.5.14.1.jar
struts2-core-2.5.14.1.jar - 配置 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<!-- 配置一个 过滤器:该过滤器是 struts2 提供的 过滤器 :StrutsPrepareAndExecuteFilter (前端控制器、中央控制器)
在 玩 struts2 的使用认识两种控制器 : StrutsPrepareAndExecuteFilter
控制器(页面(逻辑)控制器): 自定义的
-->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
</web-app>
- 创建 struts.xml 配置文件,该文件名称不能变,放置的路径一定在是class 路径的顶端
-
配置的没有提示的问题,解决如下,
-
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="p1" extends="struts-default" namespace="/hello">
<action name="struts2" class="com.xingxue.xingxue.web.controller.HelloController">
<result name="ok">
/ok.jsp
</result>
</action>
</package>
</struts>
- 编写了一个 页面控制器 Controller
package com.xingxue.xingxue.web.controller;
public class HelloController {
public String execute() {
System.out.println("execute 方法执行了...");
return "ok";
}
}
5.Struts2 执行流程
-
简易图
-
官方图:
6.Action 动作类创建三种方式
- 第一种方式
public class HelloController {
- 第二种方式: 实现Action 接口
提供了一个 execute 方法
提供了4个常量:
/**
* The action execution was successful. Show result
* view to the end user.
*/
public static final String SUCCESS = "success";
/**
* The action execution was successful but do not
* show a view. This is useful for actions that are
* handling the view in another fashion like redirect.
*/
public static final String NONE = "none";
/**
* The action execution was a failure.
* Show an error view, possibly asking the
* user to retry entering data.
*/
public static final String ERROR = "error";
/**
* <p>
* The action execution require more input
* in order to succeed.
* This result is typically used if a form
* handling action has been executed so as
* to provide defaults for a form. The
* form associated with the handler should be
* shown to the end user.
* </p>
*
* <p>
* This result is also used if the given input
* params are invalid, meaning the user
* should try providing input again.
* </p>
*/
public static final String INPUT = "input";
/**
* The action could not execute, since the
* user most was not logged in. The login view
* should be shown.
*/
public static final String LOGIN = "login";
public class HelloController2 implements Action {
@Override
public String execute() throws Exception {
return null;
}
- 第三方式: 继承ActionSupport ,可以使用 Struts2 提供的 国际化功能以及 数据校验功能
public class HelloController3 extends ActionSupport {
}
7.接收请求数据
- 模型不分离:直接在 动作类的成员位置定义变量来接收
public class RequestController {
// 动作类的方法:1,修饰符是 public 2.动作方法没有形参,3.方法的返回值有 String 或者 void
public String name;
public String password;
- 模型分离 封装数据从动作类封装变为用模型来封装
public class RequestController {
// 动作类的方法:1,修饰符是 public 2.动作方法没有形参,3.方法的返回值有 String 或者 void
// public String name;
// public String password;
// 定义接收参数的模型
public UserModel model = new UserModel();
<a href="${pageContext.request.contextPath }/p1/req2.action?model.name=lisi&model.password=123">a标签提交请求参数</a>
8.动态视图数据处理
处理的数据带到页面的操作
- servlet api 紧耦合版
ServletActionContext:
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
ServletContext servletContext = ServletActionContext.getServletContext();
- 松耦合版 (推荐使用)
ServletActionContext:
ActionContext context = ActionContext.getContext();
// 请求域中放数据
context.put("", "");
Map<String, Object> session = context.getSession();
Map<String, Object> application = context.getApplication();