struts2知识点汇总

笔记 专栏收录该内容
17 篇文章 0 订阅

Struts2学习总结

1丶Struts2基础入门
     1.1strtus简介
     1.2三种action声明方法
      1.3动态方法调用
      1.4通配符
      1.5接收请求参数的三种方法:属性驱动;模型驱动;域驱动;
2丶OGNL与值栈(ValueStack)
      2.1使用三种方法存储action的属性
        2.2.1向ValueStack中存放list集合数据
        2.2.2向ValueStack中存放set集合数据
        2.2.3向ValueStack中存放Map集合数据
3丶拦截器Interceptor
        3.1struts执行流程
        3.2拦截器的实现以及配置
4丶输入校验
        4.1输入校验的基本介绍与分类
          4.1.1代码编写的数据校验所遇到的四个问题
          4.1.2代码编写的数据校验完整实例
5丶获取web元素
6丶action小结

struts简介
struts2是基于MVC设计模式中的web应用框架 作为控制器controller控制模型和视图进行数据的交互

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />
    <include file="example.xml"/>
    <package name="default" namespace="/" extends="struts-default">
        <default-action-ref name="index" />
        <action name="index">
            <result type="redirectAction">
                <param name="actionName">HelloWorld</param>
                <param name="namespace">/example</param>
            </result>
        </action>
    </package>

    <!-- Add packages here -->

</struts>

在这里插入图片描述
Result结果类型在这里插入图片描述

三种action声明的方法

index.jsp

在这里插入图片描述
第一种:自定义pojo类,编写默认方法execute
在这里插入图片描述
第二种:实现Action接口,实现接口中的execute方法
在这里插入图片描述
最常用第三种:继承ActionSupport类,可以自定义方法,在struts.xml中注释
在这里插入图片描述
struts.xml
在这里插入图片描述

动态方法调用
当action中定义不同方法但是方法可以返回相同的页面

index.jsp
在这里插入图片描述
action
在这里插入图片描述

通配符

index.jsp在这里插入图片描述

Student.action
在这里插入图片描述
Teacher.action
在这里插入图片描述
struts.xml
在这里插入图片描述
jsp页面分类
在这里插入图片描述

接收请求参数

index.jsp
在这里插入图片描述
属性驱动
在这里插入图片描述
模型驱动
在这里插入图片描述
域驱动
在这里插入图片描述
实体类
在这里插入图片描述

值栈
root:list数据结构

Context:Map数据结构
①值栈会贯穿Action的整个生命周期,即与请求request的声明周期相同,为保证这一点,就将值栈放在request域当中
②一个Action实例只有一个值栈对象
③一个Action的非根对象都存放在同一个Map中
④当Struts接收到请求后,会创建一个Action对象和ActionContext对象,那么值栈对象也创建了,Struts会将Action放在值栈的栈顶。所以可以通过属性名访问到Action中的属性。

使用<s:debug>在未进行任何操作时查看值栈
在这里插入图片描述

使用三种方法存储action的属性

action
在这里插入图片描述
此时<s:dubug>可以发现
在这里插入图片描述
如何使用OGNL表达式获取呢/font>
在这里插入图片描述
例如:向ValueStack中保存对象类型

首先要创建一个实体类

action
在这里插入图片描述
<s:debug>发现是存在的(使用的是action本身属性赋值的方法)
在这里插入图片描述
jsp页面中这样取:
在这里插入图片描述

向ValueStack中存放list集合数据

action
在这里插入图片描述
<s:debug>
在这里插入图片描述

从值栈中去list集合的四种方法

第一种
在这里插入图片描述
第二种
在这里插入图片描述
第三种
在这里插入图片描述
第四种
在这里插入图片描述

向值栈中加入set集合

在这里插入图片描述
在这里插入图片描述

向值栈中加入Map集合数据

在这里插入图片描述
在这里插入图片描述

拦截器Interceptor

拦截器是struts2的核心,大部分的功能都是拦截器在完成

拦截器:基于java的映射,只有在struts工程中才能被使用
过滤器:基于函数的回调,是servlet规范的一部分,在任何的java web工程中都可以使用,

struts执行流程

在这里插入图片描述
1,客户端初始化一个指向servlet容器的请求。

2,请求经过一系列的过滤器( ActionContextCleanUp、SiteMesh )

3,FilterDispatcher被调用,并询问ActionMapper来决定这个请求是否需要调用某个Action

4,ActionMapper决定要调用那一个Action,FilterDispatcher把请求交给ActionProxy。

5,ActionProxy通过Configurate Manager询问Struts配置文件,找到要调用的Action类

6,ActionProxy创建一个ActionInvocation实例

7,ActionInvocation实例使用命令模式来调用,回调Action的exeute方法

一旦Action执行完毕,ActionInvocation负责根据Struts.xml的配置返回结果。

拦截器的实现以及配置
1,声明一个类实现Interceptor接口

2,声明一个类继承AbstractInterceptor类
在这里插入图片描述

在这里插入图片描述输出结果:
Interceptor执行了
调用action方法
Interceptor结束了

invocation.invoke()当上一个拦截器执行完之后会接着调用接下来的拦截器,若都已实现完了,那么就去调用被拦截的方法

struts.xml

在这里插入图片描述
用拦截器还可以实现权限校验的功能

4.输入校验
分类以及基本的原理
1.在action类中实现 2.在配置struts.xml文件中实现

在action类中实现
在这里插入图片描述
ActionSupport内部继承了Validateable接口,所以直接定义一个类继承ActionSupport并实现Validate方法即可
在这里插入图片描述

进行代码编写的数据校验所遇到的四个问题
问题一:在一些方法之前不会调用validate方法 原因:

在这里插入图片描述
问题二:不想某些方法使用数据校验
解决:再不想使用校验的方法上用@SkipValidation
在这里插入图片描述
问题三:如果只有少数的方法需要使用数据校验
就将Validate方法改为ValidateXxx()名称Xxx为所需要校验的方法

问题四:Validate进行校验失败后会跳转到默认的视图(“input”);
如果想要跳转到自己自定义视图那么就在方法上加@InputConfig

在这里插入图片描述

完整实例
index.jsp

在这里插入图片描述
action

package cn.zhiming.validation;

import org.apache.struts2.interceptor.validation.SkipValidation;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.interceptor.annotations.InputConfig;

public class Validation extends ActionSupport{

	private static final long serialVersionUID = 1L;
 private String username;
 private String password;

public void setUsername(String username) {
	this.username = username;
}

public void setPassword(String password) {
	this.password = password;
}
@SkipValidation
public String add(){
	return SUCCESS;
}
@InputConfig(resultName="output")
public String execute() throws Exception {
	return SUCCESS;
}
public String input(){
return SUCCESS;
}
//validation方法最先执行
 public void validate() {
	 System.out.println("检测");
	if(!"1234567".equals(username)&&username.trim().length()>6){
//将错误信息存储到root区域内
		super.addFieldError("usernameerror","您输入的的用户名错误重新输入");
	}
	if(username.trim().length()<6){
		super.addFieldError("usernameerror","您输入的的用户名不符合规范请重新输入");
	}
	if(!"1234567".equals(password)&&password.trim().length()>6){
		super.addFieldError("passworderror","您输入的密码错误请重新输入");
	}
	if(password.trim().length()<6){
		super.addFieldError("passworderror","您输入的密码不符合规范请重新输入");
	}
}
    }


struts.xml
在这里插入图片描述
结果页面
在这里插入图片描述

<s:debug>分析
输入的是一个长度大于6但是不是正确的信息

在这里插入图片描述

获取web元素
有些时候我们要判断用户是否登陆需要判断request是否携带参数,在action中我们也可以获取web元素

获取的web元素分为Map类型,以及真实的Http类型
1,在Action中获取Map类型的request,session,application,依赖于容器的方式
2,实现aware接口,依赖IOC注入
3,通过ServletActionContext获得Http类型

实例
index.jsp

在这里插入图片描述
struts.xml
在这里插入图片描述
|第一种:属性注入。实现RequestAware,SessionAware,ApplicationAware接口|
LoginAction1


public class LoginAction1 extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
private Map<String,Object> request;
private Map<String,Object> session;
private Map<String,Object> application;
private String name;

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

public void setRequest(Map<String, Object> request) {
	this.request = request;
}


public void setSession(Map<String, Object> session) {
	this.session = session;
}

public void setApplication(Map<String, Object> application) {
	this.application = application;
}

@Override
public String execute() throws Exception {
	// TODO Auto-generated method stub
	request.put("name1",name);
	request.put("aa","isa1");
	session.put("bb","isb1");
	application.put("cc","isc1");
	return SUCCESS;
}

}

|第二种:依赖容器。通过action的上下文(ActionContext.getContext)|
记得request特殊

LoginAction2
在这里插入图片描述

使用<s:debug>

第一部分:Value stack(值栈) 其中包含的是一些Action中的属性、errors、fieldErrors、actionErrors等内容

第二部分:Stack Context 也就是ActionContext (action的上下文环境),其中就包括了许多的key和对应的value

在key的取值中就有request,所以上面用get(“request”)的方式就会取到Map类型的request值在这里插入图片描述
|第三种:通过ServletActionContext获取HTTP类型|

LoginAction3
在这里插入图片描述
|第四种:属性注入。获得的是HTTP类型|
在这里插入图片描述
jsp页面
在这里插入图片描述

action小结

1、实现一个Action的最常用方式,继承ActionSupport
(POJO、实现Action接口的方式不推荐)

2、DMI动态方法调用 !

3、通配符的配置:* {1}{2} _ 等的灵活使用

4、Action接收参数的方法(属性、DomainModel、ModelDriven),一般推荐使用前两种方法。

5、简单参数验证addFieldError
获取信息做显示的时候一般不适用struts的UI标签,比如<s:fielderror />,而更多的去使用不带有显示格式的<s:property />标签。

6、访问Web元素
a) Map类型
i) 依赖Struts2
ii) IoC (DI)
b) 原始类型
i) 依赖Struts2
ii) IoC (DI)

7、包含文件配置

8、默认Action处理
当用户访问某个命名空间下的不存在的action的时候,我们可以设定自动转向到一个默认的action

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

慕好夕颜

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值