文章目录
第一讲
01 model1->model2->mvc>框架的演进
- 我之前详细写过这个话题,参见 mvc深入理解
- 框架之所以出现,就是因为model2开发模型存在的缺陷,举个最简单的案例,每次表单传递过来的参数都是字符串类型,而且在controller中每次都要进行类型转换,是灰常麻烦的,重复的代码很多。回顾我们学习编程的路径:基础语法->方法->类->jar包->框架。最开始对简单的语法进行封装形成方法,方便我们重用。而面向对象的编程继承、封装、多态,也会大大提高代码重用性,也是为了优化这一过程。而对类的封装又形成了jar包,对一组jar包的封装便形成了框架。
- 框架就是模板,模型,如简历模板,框架由两部分组成,可变的部分和不可变的部分,如下图
橙黄色(Servlet Filters):struts2的过滤器。
蓝色(Struts core):表示struts2核心部分的知识。
绿色(Interceptors):表示拦截器。
黄色(User Created):用于说明这部分是开发人员自己定义的部分。即是所为的开发代码。
struts2是一个框架,位于 web层(web框架), 接管了controller ,dao层也有很多不爽的地方,所以用hibernate来代替。框架将程序员以前重复性的工作,流程化,自动化,这样就可以大大的提高开发的速度,即一些重复性的代码和工作,由框架帮助我们完成 。框架不变的部分是指事先已经给程序员规划好组件(action,拦截器,配置文件),程序员必须遵守相应的规范。
02 什么是轻量级
- 轻量级:如果一个框架没有侵入性,就称该框架是轻量级
- 侵入性:如果使用一个框架,必须实现框架的接口或继承框架的类
- struts是一个轻量级框架
第二讲
01 流程图(上图或者超链接)
- 看图
- 步骤(当请求到达Servlet容器的时候,这个容器可以是Jetty、可以是Tomcat)
- 首先要经过struts的核心过滤器StrutsPreparedAndExecuteFilter(action和jsp都会过滤)
- 然后核心控制器依次查找ActionMapper来决定这个请求是否调用action,如果actionMapper决定调用action,StrutsPreparedAndExecuteFilter就把请求的处理控制权委托给ActionProxy。
- ActionProxy通过配置管理器查询Struts2的核心配置文件(struts.xml),找到要调用的Action类。
- 接下来,ActionProxy创建一个ActionInvocation实例,该实例负责命令模式的实现,包括激活action本身之前调用配置的任意拦截器(是指核心配置文件中配置的,extends继承的struts-default就默认配置着拦截器,在上一步已经进行了加载)。
- 在action执行完成之后,ActionInvocation实例负责根据action返回的结果码在struts.xml配置文件中查找到要输出的结果(Result)。该结果通常是JSP或者FreeMarker模板,也可能是action,输出的时候,模板也可以使用框架提供的struts2标签,(此时的JSP页面已经被服务器解释,页面内容不可能再被添加,被解释之后之后内容是Http响应的一部分)。
- 然后为action配置的拦截器将再次执行(做最后的收尾工作)
- 最后,服务器响应将通过web.xml文件中配置的Struts框架核心控制器返回
- 注意:如果url-pattern配置的是/*。那么所有请求都会被拦截,比如你请求的是jsp也会被拦截。其实之前的写的一篇文章就很好证明了这一点。action的class属性出错,导致加载配置文件失败,Dispatcher初始化失败。从流程图就可以看出,ActionProxy会决定该请求不调用action,垂直向下走,如果使用到了struts标签,服务器端过滤显示,如果到了Template那么jsp就可以显示到客户端,注意拦截器只能拦截action,jsp不可能被拦截器拦截。 jsp是有必要被拦截的,参见本链接。而且servlet请求统统会被当成struts请求处理掉。
02 开发流程-HelloWorld案例
- 先在eclipse中创建一个动态的web项目(或者是maven项目)
- 导入jar包(maven在pom.xml文件中写明struts的jar包坐标)
- 编写web.xml文件—配置struts的核心控制器
<!--这种写法过滤所有请求-->
<filter>
<filter-name>struts2</filter-name>
<filterclass>org.apache.struts2.dispatcher.ng.filter.
StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--这种写法过action、jsp请求-->
<filter>
<filter-name>struts2</filter-name>
<filterclass>org.apache.struts2.dispatcher.ng.filter.
StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
- 编写业务处理类
package com.tn.action;
import com.opensymphony.xwork2.ActionSupport;
public class HelloAction extends ActionSupport{
@Override
public String execute() throws Exception {
System.out.println("hello,体测~~");
return SUCCESS;
}
}
- 配置核心配置文件struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<!-- package:表示我们可以进行分包管理
name:包的名字 默认 default
namespace:报的命名空间,默认/
-->
<package name="default" namespace="/" extends="struts-default">
<action name="hello" class="com.tn.action.HelloAction">
<result>/success.jsp</result>
</action>
</package>
</struts>
- 编写success.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="uft-8">
<title>成功页面</title>
</head>
<body>
<h1>hello,world!</h1>
</body>
</html>
运行结果:
注意:这两种访问方式可不一样,第一种访问方式走的是struts上述1-7步的正规流程。而第二种访问方式虽然也被过滤了一波,但仅仅是被过滤而已,如果里面有struts标签,在struts框架先解释,解释完了tomcat再解释jsp,最后给浏览器,走的是01中注意那条线。这就没用到struts框架,所以老师在上课还专门强调了这个问题
03 struts核心配置文件
- package:分模块管理,作用和java中的包类似
- name:自定义但不能重复
- namespace:命名空间,和url请求路径直接相关
- extends:必须直接或间接继承struts-default
- action:url和处理类的方法进行映射
- name:为请求名,不加后缀
- class:处理类的完全限定名称,如果不配置,由默认类来处理
- method:处理请求的方法,默认为execute
- result
- name 结果集名称,和处理方法的返回值匹配,默认为success,可以自定义
- type 指定响应结果类型
- dispatcher 转发 默认
- redirect 重定向
- redirectAction 重定向到Action
- 三者区别请参见 本链接