一. 第一部分
自己尝试模仿一个myStruts框架有利于理解和使用别人的成熟框架。
MVC模式:
- Model – JavaBean
- View – JSP
- Control
Control,控制器
Servlet起到控制器的作用
- 获取请求数据,封装;
- 调用Service()处理业务逻辑;
- 跳转(转发/重定向)
为何要用框架?
传统的MVC开发:
- 每一个模块都要写servlet,并且在web.xml中配置;
- 跳转代码写死,不灵活
1. 登陆注册案例,框架优化
需求:
- 一个servlet处理所有请求;
- 登陆成功,跳转到index.jsp
- 注册成功,跳转到index.jsp或者login.jsp
在Servlet中,将具体动作封装到ServletAction模块中去完成,Servlet只负责创建Action对象和接受跳转信息。此时Servlet只起到控制器的作用,不处理业务逻辑。
一个Servlet对应一个Action:
首先复习一下,使用MVC模型,写一个简单的登陆注册逻辑
2. 下面开始模仿struts修改传统模式
1. 步骤
- 首先,将多个Servlet提取出来,成为多个action(也是Servlet);
- 然后新建单独一个ActionServlet类作为核心控制器,控制这些Servlet。这里的核心是一个配置文件mystruts.xml(src目录下);
- 通过反射,执行从配置信息中获取到的需要执行的类、方法以及返回标记;
- 拿到标记,读取文件得到标记对应页面,实现重定向或者转发。
2. 具体实现:
读取配置文件,使用对象封装:
- 将读取配置文件写入Bean包,创建想要获取的对象的类;
- 使用dom4j读取xml文件:还要导入logging依赖包(不使用XPath);
- 通过SAXReader读入xml文件,逐步读取节点Element,将节点封装到对象中;
实现ActionServlet类
- 获取请求uri,得到请求路径,也就是actionName;
- 通过actionName得到相应的ActionMapping,也就可以得到action的所有信息:类全名,方法
- 通过反射,创建action类对象,调用方法,也就是执行相应的action。
这样,在以后项目需要扩展维护时,不需要再去修改核心控制的ActionServlet类;只需要添加或者修改具体的action类,再修改配置文件即可。–就相当于在你想给电脑升级时,不需要更换CPU,只需要按照厂家的配置要求,搭配好内存主板就可以了。
3. Struts开发
开发步骤:版本至少2.3
- 创建web项目,引入Struts.jar包;
- struts2-core-2.3.4.1.jar
- xwork-core-2.3.4.1.jar
- commons-fileupload-1.2.2.jar //文件上传
- commons-io-2.0.1.jar
- commons-lang3-3.1.jar //扩展java.lang包
- freemarker-2.3.19.jar //标签模板库
- javassist-3.11.0.GA.jar //优化处理字节码
- ognl-3.0.5.jar //Ognl表达式
- web.xml中,引入struts核心功能,配置过滤器;
- 开发action,在Struts中,使用action类取代了之前的Servlet;
- 配置action:src/struts.xml;
HelloStruts
配置完web.xml后:
package com.cityu.action;
import com.opensymphony.xwork2.ActionSupport;
public class HelloAction extends ActionSupport{
public String execute() throws Exception {
System.out.println("访问到了action。。。。正在处理请求");
System.out.println("调用service()。。。。。。");
return "SUCCESS";
}
}
再配置src/struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<struts>
<package name="xxx" extends="default">
<action name="hello" class="com.cityu.action.HelloAction" method="execute">
<result name = "SUCCESS">/success.jsp</result>
</action>
</package>
</struts>
这样,访问hello,就可以跳转到/success.jsp页面
二. 第二部分
SSH框架在mvc模式中的作用:
- Struts:控制层框架;
- Hibernate:Dao层框架,提供持久化技术;
- Spring整合Struts和Hibernate,并且提供Service层的事务管理框架;
框架?
软件中的框架,是一种半成品。项目开发需要在框架的基础上进行,因为框架已经实现了一些功能,从而提高开发效率。在中大型应用中必须使用框架来简化开发流程,规范开发。
1. Struts2框架概述
最早的基于mvc模式的框架;在Struts1基础上融合了xwork的功能
预先实现的功能:
- 请求数据的自动封装—原先使用request.getParameters()以及JaveBean封装
- 文件上传的功能;
- 国际化简化
- 数据校验
- …
2. Struts开发流程
开发步骤:版本至少2.3
创建web项目,引入Struts.jar包;
- struts2-core-2.3.4.1.jar
- xwork-core-2.3.4.1.jar
- commons-fileupload-1.2.2.jar //文件上传
- commons-io-2.0.1.jar
- commons-lang3-3.1.jar //扩展java.lang包
- freemarker-2.3.19.jar //标签模板库
- javassist-3.11.0.GA.jar //优化处理字节码
- ognl-3.0.5.jar //Ognl表达式
web.xml中,引入struts核心功能,配置过滤器;
- Tomcat启动时,首先加载自身的web.xml;再加载各个WebApp的web.xml;
- 在web.xml中配置过滤器,从而完成Struts核心功能的初始化;
- filter(init/doFliter/destroy);init()方法,服务器启动时执行,而doFilter()方法用户访问时执行—和servlet不同!—第一次访问时,执行初始化和service()方法,以后每次调用,只执行service()方法;
- 核心过滤器org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter—旧版本不同,核心过滤器类不同!
开发action,在Struts中,使用action类取代了之前的Servlet;
- 一般继承ActionSupport类;
- action中的业务方法,处理具体请求:必须返回String,不能有参数;
配置action:src/struts.xml;
- 处理指令:版本,编码;文档类型声明—dtd约束文件
3. Struts执行流程(重点)
服务器启动:
- 加载项目web.xml;
- 创建Struts核心过滤器对象,执行filter的init()方法:
- 依次加载struts-default.xml, 核心功能初始化
- struts-plugin.xml, struts相关插件
- struts.xml 用户编写的配置文件
访问:
- 用户访问Action,服务器根据访问的路径,找到对应的action配置,创建action对象;
- 执行默认拦截器栈中定义的18个拦截器;
- 再去执行action业务方法;
- 后面每次访问都会创建action实例,重复3、4、5;从而不同于servlet,是线程安全的
对于struts-default.xml详解
服务器部署项目时,就会读取这个配置文件对struts核心功能进行初始化:
/struts-core.jar/struts-default.xml
内容
1. Bean节点
2. 一个package节点:struts-default
1. 用户配置的struts.xml需要继承这个包;
2. 指定了跳转类型:dispatcher(默认转发);redirect;redirectAction;stream(下载文件时使用)
3. 定义了所有的拦截器:32个—为了拦截器方便,可以使用stack引用拦截器(相当于将一系列拦截器放入一个文件夹中)
4. 指定默认执行的拦截器栈(defaultStack)以及action(ActionSupport)
拦截器:功能与过滤器类似
- 共同点在于都是拦截资源;
- 区别在于:过滤器可以拦截所有资源;而拦截器只拦截action请求,是struts中的概念。
- 问题:拦截器什么时候执行?先执行action类还是先执行拦截器?
- 用户访问action时,先执行Action类对象的创建,然后按照顺序执行18个拦截器,最后执行Action类业务方法。(使用代理完成这个过程!)
4. struts.xml配置文件详解
package元素:一个业务模块(一个Model,例如User,Order,Goods对应一个package)
- name:包的名字,不能重复;
- extends:一般继承struts-default;
- abstrate=”true”:代表为抽象包,抽象包中不能有action。因此抽象包的作用只是为了被继承;
- namespace:名称空间,默认为”/”,作为路径的一部分
action元素:配置请求路径与Action类的关系
- name:请求路径;
- class:action类全名;
- method:请求处理方法;
result元素:action处理方法method执行后的返回值
- name:返回值;
- type:跳转的结果类型;
- 标签体内容:指定跳转页面;
在有多个action时,可以将src/struts.xml作为总配置文件,引入其他action配置文件
<include file = ".xml文件全名"></include>