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的基本使用
- 下载struts框架
下载struts官网
对下载下来的struts的目录进行介绍
- 创建Java Web项目并引入相应的jar包
我用到的所有jar包 - 编写jsp页面并写上连接发送一个请求
<a href="hello.action">href</a>
- 编写Action类,提供execute() 方法,底层会使用反射执行该方法
package action;
public class HelloAction {
public String execute(){
System.out.println("hello");
return null;
}
}
- 创建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>
- 配置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接收参数
-
使用requestApi
-
提供属性的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;
}
}
- 采用模型驱动方式
创建接收参数的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中的配置有效
使用:
来源:CSDN
作者:今天又学java了
链接:https://blog.csdn.net/weixin_43907800/article/details/103745158