Struts

陌路散爱 提交于 2019-12-28 17:34:55

Struts2简介

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。

web框架的特点

都是基于前端控制器模型来设计的,浏览器发送的所有的请求,都需要经过前端控制器,前端控制器再根据具体的请求所要实现 的功能,分发到不同的action来处理,所有的分发操作都是框架自动帮你完成的,我们只需要关心数据怎么样处理,封装,接收这些都不用管,其余的操作都是前端控制器来帮你完成

前端控制器是通过过滤器来实现的,过滤器当中会有接收数据,封装数据,把所有的东西都帮你处理好,最后到action当中就可以直接使用了

Struts的基本使用

  1. 下载struts框架
    下载struts官网

对下载下来的struts的目录进行介绍
在这里插入图片描述在这里插入图片描述

  1. 创建Java Web项目并引入相应的jar包
    我用到的所有jar包
    在这里插入图片描述
  2. 编写jsp页面并写上连接发送一个请求
<a href="hello.action">href</a>
  1. 编写Action类,提供execute() 方法,底层会使用反射执行该方法
package action;

public class HelloAction {
    public String execute(){
        System.out.println("hello");
        return null;
    }
}

  1. 创建Struts配置文件
<?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="struts" extends="struts-default">
        <action name="hello" class="action.HelloAction"></action>
    </package>
</struts>
  1. 配置web.xml ,配置前端控制器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <filter>
        <filter-name>action2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>action2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

Struts的执行流程

在这里插入图片描述

Action类的写法

推荐继承ActionSupport类
Actionsupport当中提供了很多功能,数据校验,国际化等一系列操作方法

package action;

import com.opensymphony.xwork2.ActionSupport;

public class HelloAction extends ActionSupport {
    public String execute(){
        System.out.println("hello");
        return null;
    }
}

Struts配置文件

1. Package
包,这个包与Java中的包的概念不一致。包为了更好管理action的配置属性
1.1 name:包的名称,只有在一个项目中不重名即可。
1.2 extends:继承哪个包,通常值为struts-default。默认我们继承的是Struts-default,在这个包当中,定义了很多结果类型和很多的拦截器,继承了这些东西之后,action才有了这些功能
1.3 namespace:namespace+name共同决定了访问路径,名称空间有三种写法
1.3.1 带名称的名称空间,namespace=”/aaa”
1.3.2 根名称空间,namespance=”/”
1.3.3 默认名称空间,namespace=””
1.4 abstract:抽象的,用于其他包的继承,现在这个包想被别人继承,设置abstract值为true,设置成abstract后就不能用自己运行了

2. action
配置Action类。
2.1 属性
2.1.1 name:与namespace共同决定访问路径
2.1.2 class:Action类的全路径
2.1.3 method:执行Action中的哪个方法的方法名,默认值execute
2.1.4 converter:用来自定义类型转换器,一般不设置,内部提供的转换器已经够用

Struts接收参数

  1. 使用requestApi

  2. 提供属性的set方法
    在Action当中提供对应属性的set方法,会自动接收参数,并且会自动做类型转换,只适合接收少量的数据
    表单:

  <form action="hello.action">
    name:<input type="text" name="cust_name"/>
    phone:<input type="text" name="cust_phone"/>
    <input type="submit" value="submit">
  </form>

Action:

package action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import domain.Customer;

import java.util.concurrent.AbstractExecutorService;

public class HelloAction extends ActionSupport{
    private String cust_name;
    private String cust_phone;

    public String getCust_name() {
        return cust_name;
    }

    public void setCust_name(String cust_name) {
        this.cust_name = cust_name;
    }

    public String getCust_phone() {
        return cust_phone;
    }

    public void setCust_phone(String cust_phone) {
        this.cust_phone = cust_phone;
    }

    public String execute(){
        System.out.println("hello");
        System.out.println(cust_name+cust_phone);
        return null;
    }


}

  1. 采用模型驱动方式
    创建接收参数的dmain模型,Action实现ModelDriven接口,实现接口方法getModel(),创建一个模型对象,在接口方法中返回

表单:

<form action="hello.action">
    name:<input type="text" name="cust_name"/>
    phone:<input type="text" name="cust_phone"/>
    <input type="submit" value="submit">
</form>

domain类:

package domain;

public class Customer {
    private int cust_id;
    private String cust_name;
    private String cust_phone;


    public int getCust_id() {
        return cust_id;
    }

    public void setCust_id(int cust_id) {
        this.cust_id = cust_id;
    }

    public String getCust_name() {
        return cust_name;
    }

    public void setCust_name(String cust_name) {
        this.cust_name = cust_name;
    }

    public String getCust_phone() {
        return cust_phone;
    }

    public void setCust_phone(String cust_phone) {
        this.cust_phone = cust_phone;
    }
    //非必须只是方便打印
    @Override
    public String toString() {
        return "Customer{" +
                "cust_id=" + cust_id +
                ", cust_name='" + cust_name + '\'' +
                ", cust_phone='" + cust_phone + '\'' +
                '}';
    }
}

Action:

package action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import domain.Customer;

import java.util.concurrent.AbstractExecutorService;

public class HelloAction extends ActionSupport implements ModelDriven<Customer> {
    private Customer customer = new Customer();
    @Override
    public Customer getModel() {
        return customer;
    }

    public String execute(){
        System.out.println("hello");
        System.out.println(customer);
        return null;
    }
}

结果页配置

1. 全局配置
全局结果页面:
在包中配置一次,其他的在这个包中的所有的action只要返回了这个值,都可以跳转到这个页面。

使用场景:
有些功能需要用户登陆才能使用,只要没有登录,就让它返回到登录页面,很多地方都要返回到登录,所以可以把登录页做为一个全局的

使用:
在这里插入图片描述

2. 局部配置(全局和局部名字相同会先找局部的)
局部结果页面:
只能在当前的action中的配置有效

使用:
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!