Struts 2 学习(一)从自定义myStruts到入门概念

一. 第一部分

自己尝试模仿一个myStruts框架有利于理解和使用别人的成熟框架。

MVC模式:

  • Model – JavaBean
  • View – JSP
  • Control

Control,控制器

Servlet起到控制器的作用

  • 获取请求数据,封装;
  • 调用Service()处理业务逻辑;
  • 跳转(转发/重定向)

为何要用框架?

传统的MVC开发:

  • 每一个模块都要写servlet,并且在web.xml中配置;
  • 跳转代码写死,不灵活

1. 登陆注册案例,框架优化

需求:

  1. 一个servlet处理所有请求;
  2. 登陆成功,跳转到index.jsp
  3. 注册成功,跳转到index.jsp或者login.jsp

在Servlet中,将具体动作封装到ServletAction模块中去完成,Servlet只负责创建Action对象和接受跳转信息。此时Servlet只起到控制器的作用,不处理业务逻辑。

一个Servlet对应一个Action:

首先复习一下,使用MVC模型,写一个简单的登陆注册逻辑

2. 下面开始模仿struts修改传统模式

1. 步骤

  1. 首先,将多个Servlet提取出来,成为多个action(也是Servlet);
  2. 然后新建单独一个ActionServlet类作为核心控制器,控制这些Servlet。这里的核心是一个配置文件mystruts.xml(src目录下);
  3. 通过反射,执行从配置信息中获取到的需要执行的类、方法以及返回标记;
  4. 拿到标记,读取文件得到标记对应页面,实现重定向或者转发。

2. 具体实现:

  1. 读取配置文件,使用对象封装:

    • 将读取配置文件写入Bean包,创建想要获取的对象的类;
    • 使用dom4j读取xml文件:还要导入logging依赖包(不使用XPath);
    • 通过SAXReader读入xml文件,逐步读取节点Element,将节点封装到对象中;
  2. 实现ActionServlet类

    • 获取请求uri,得到请求路径,也就是actionName;
    • 通过actionName得到相应的ActionMapping,也就可以得到action的所有信息:类全名,方法
    • 通过反射,创建action类对象,调用方法,也就是执行相应的action。
  3. 这样,在以后项目需要扩展维护时,不需要再去修改核心控制的ActionServlet类;只需要添加或者修改具体的action类,再修改配置文件即可。–就相当于在你想给电脑升级时,不需要更换CPU,只需要按照厂家的配置要求,搭配好内存主板就可以了。

3. Struts开发

开发步骤:版本至少2.3

  1. 创建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表达式
  2. web.xml中,引入struts核心功能,配置过滤器;
  3. 开发action,在Struts中,使用action类取代了之前的Servlet;
  4. 配置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模式中的作用:

  1. Struts:控制层框架;
  2. Hibernate:Dao层框架,提供持久化技术;
  3. Spring整合Struts和Hibernate,并且提供Service层的事务管理框架;

框架?

软件中的框架,是一种半成品。项目开发需要在框架的基础上进行,因为框架已经实现了一些功能,从而提高开发效率。在中大型应用中必须使用框架来简化开发流程,规范开发。

1. Struts2框架概述

最早的基于mvc模式的框架;在Struts1基础上融合了xwork的功能

预先实现的功能:

  1. 请求数据的自动封装—原先使用request.getParameters()以及JaveBean封装
  2. 文件上传的功能;
  3. 国际化简化
  4. 数据校验

2. Struts开发流程

开发步骤:版本至少2.3

  1. 创建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表达式
  2. 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—旧版本不同,核心过滤器类不同!
  3. 开发action,在Struts中,使用action类取代了之前的Servlet;

    • 一般继承ActionSupport类;
    • action中的业务方法,处理具体请求:必须返回String,不能有参数;
  4. 配置action:src/struts.xml;

    • 处理指令:版本,编码;文档类型声明—dtd约束文件

3. Struts执行流程(重点)

服务器启动:

  1. 加载项目web.xml;
  2. 创建Struts核心过滤器对象,执行filter的init()方法:
    1. 依次加载struts-default.xml, 核心功能初始化
    2. struts-plugin.xml, struts相关插件
    3. struts.xml 用户编写的配置文件

访问:

  1. 用户访问Action,服务器根据访问的路径,找到对应的action配置,创建action对象;
  2. 执行默认拦截器栈中定义的18个拦截器;
  3. 再去执行action业务方法;
  4. 后面每次访问都会创建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)

拦截器:功能与过滤器类似

  1. 共同点在于都是拦截资源;
  2. 区别在于:过滤器可以拦截所有资源;而拦截器只拦截action请求,是struts中的概念。
    1. 问题:拦截器什么时候执行?先执行action类还是先执行拦截器?
    2. 用户访问action时,先执行Action类对象的创建,然后按照顺序执行18个拦截器,最后执行Action类业务方法。(使用代理完成这个过程!)

4. struts.xml配置文件详解

  1. package元素:一个业务模块(一个Model,例如User,Order,Goods对应一个package)

    1. name:包的名字,不能重复;
    2. extends:一般继承struts-default;
    3. abstrate=”true”:代表为抽象包,抽象包中不能有action。因此抽象包的作用只是为了被继承;
    4. namespace:名称空间,默认为”/”,作为路径的一部分
  2. action元素:配置请求路径与Action类的关系

    1. name:请求路径;
    2. class:action类全名;
    3. method:请求处理方法;
  3. result元素:action处理方法method执行后的返回值

    1. name:返回值;
    2. type:跳转的结果类型;
    3. 标签体内容:指定跳转页面;
  4. 在有多个action时,可以将src/struts.xml作为总配置文件,引入其他action配置文件

    <include file = ".xml文件全名"></include>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值