IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java Struts2框架 -> 正文阅读

[Java知识库]Java Struts2框架

Struts2框架

Struts2框架技术

Struts框架提供了一种基于MVC体系结构的Web程序开发方案,具有组件模块化、灵活性和重要性等优点

Struts2框架简介

Struts是整合了当前主流网站技术中的Servlet、JSP、JavaBean、JDBC、XML等相关开发技术基础之上的一种主流Web开发框架。

Struts2的组成与工作原理

Struts2框架按照MVC的思想主要有控制层,包括核心控制器FilterDispatcher、业务控制器Action;模型层,包括业务逻辑组件和数据库访问组件;视图组件。

  1. 模型组件

模型组件是业务逻辑的模块,有JavaBean或者EJB构成

  1. 视图组件

视图组件主要有HTML、JSP和Struts2标签,以及FreeMarker、Velocity等模块视图技术

  1. 控制器组件

控制器组件主要有一个StrutsPrepareAndExecuteFilter核心控制器:拦截< url-pattern>/*< /url-pattern>指定的所有用户请求
业务控制器Action组成:普通的Java类、不需要实现任何接口或继承任何类

Created with Rapha?l 2.2.0 浏览器发出请求 Struts2内置的拦截器或用户自定义拦截器 StrutsPrepareAndExecuteFilter拦截请求 Actionl类实现业务操作 响应浏览器

搭建Struts2框架

搭建Struts2框架,需要两个步骤:1、下载Struts2框架,找到开发Struts2应用所需要的Jar文件,导入工程。2、修改Web.xml文件,加入Struts2MVC框架启动配置。
Struts必须与JDK1.4以上版本和Servlet Container(Tomcat)结合使用。

Struts框架文件目录介绍

  • apps

文件夹下包含了Struts2的示例应用

  • docs

文件夹下包含了Struts2的相关文档,Struts2快速入门、Struts2的文档

  • lib

文件夹下包含了Struts2框架的核心类库,以及Struts2的第三方插件类库

  • src

文件下包含了Struts2框架的全部源代码

下载配置Struts2框架

下载地址:http://struts.apache.org/download

  1. 下载Struts框架
    在这里插入图片描述

  2. 解压struts-2.3.37-all.zip文件
    在这里插入图片描述

  3. 开发Struts2应用所依赖的Jar文件

    • struts2-core-2.x.x.jar:Struts2框架的核心类库
    • xwork-core-2.x.x.jar:XWork类库
    • ognl-x.x.x.jar:对象图导航语言,struts2框架通过其读写对象的属性
    • freemarker-2.x.x.jar:Struts2的UI标签的模板使用FreeMarker编写
    • commons-logging-x.x.x.jar:日志记录
    • commons-fileupload-x.x.x.jar:文件上传组件
    • javassist-x.x.x.GA.jar:对象图导航语言类库
    • commons-validator-x.x.x.jar:验证类库
  4. 导入Jar包
    在这里插入图片描述

  5. Web.xml文件中配置Struts2启动信息
    在这里插入图片描述

  6. 配置项目下Src文件中的struts.xml文件

暂且不需要,下文需要再详细说明

Struts2入门案例——基于Struts2任意两个数据的代数和

input.jsp用于输入两个数,InputAction.java 用于处理接受的数加以运算,结果为非负数:positive.jsp,否则:negative.jsp

输入数字页面:input.jsp
在这里插入图片描述
在这里插入图片描述

业务处理页面:InputAction.java
在这里插入图片描述

输出结果页面:positive.jsp negatiive.jsp
在这里插入图片描述
在这里插入图片描述

Struts2的中文乱码

中文乱码问题一般指的是当请求参数中有中文时,无法在Action中得到正确的中文。Struts2中有两种方法可以解决这个问题。

  1. 设置JSP页面的pageEncoding=“UTF-8”。
  2. 如果JSP页面的pageEncoding=“GBK”,那么需要在源包(Src)下,建立一个属性文件struts.properites,并在文件内填写如下内容。

struts.locale=zh_CN
struts.i18n.encoding=gbk

Struts框架配置文件

在这里插入图片描述

  1. Bean配置

如上配置格式

  1. 常量配置

如上配置格式
主要用于指定struts中的常量取值

  1. 包含配置

如上配置格式
< include/>元素能把其他开发的配置文件包含过来,但是被包含的每个配置文件必须和struts.xml格式一样。

  1. 包配置

Struts2框架中使用包来管理Action,主要用于管理一组业务功能相关的action。实际应用中,应该把一组业务功能相关的Action放在同一个包中

  • name属性

配置包时必须指定的属性,必须唯一。指定了包名,其他包要继承该包,必须通过该属性进行引用。

  • namespace属性

用于定义该包的命名空间,作为访问Action的一部分

  • extends属性

通常每个包都要继承struts-default包,因为Struts很多核心的功能都是拦截器实现的。struts-default定义了这些拦截器。当包继承了struts-default才能使用struts2的核心功能。
struts-default包是在struts2-core-2.x.x.jar文件中的struts-default.xml中定义的,struts-default.xml也是Struts2默认配置文件,且自动加载

  1. Action配置

Action的配置能够让Struts2知道Action的存在。Struts2使用包来组织和管理Action

  • name

指定客户端发送请求的地址映射名称。

  • class

指定Action的实现类的完整名

  • method

指定Action类中的处理方法名,默认为Action中的execute()方法

  • converter

指定Action类型转换器的完整类名

  1. result配置

作为< action>的子元素用于配置action跳转的目的地

  • name

用于判断action类的处理方法返回值,若等于,则跳转指定页面。

  • type

指定结果类型定向到什么类型的文件,可以是JSP文件或者Action类。

  1. result类型——type属性及其属性值

type可以有多种选择,默认的JSP页面的转发。若要指定其他类型的页面,需要配置如下属性。

  • dispatcher

默认类型,表示转发到JSP页面。和< jsp:forward/>效果一致。

	<result name = “success" type="dispatcher">
	//<param name="location">属性指定了转发的页面
	//<param name="parse">属性指定了转发的页面是否允许使用OGNL表达式。
		<param name="location">/message.jsp</param>
		<param name="parse">true></param>
	</result>
  • redirect

重定向,配置方法类似上述

  • chain

表示转发到Action

	<result name="resultName" type="chain">
		<param name="namespace">表示Action所造的命名空间</param>
		<param name="actionName">表示Action名</param>
	</result>
  • redirectAction

重定向Action,方法类似上述。

如何访问Action

访问Action有两个关键点:1、包的命名空间。2、Action的名称。

例如:

	<package name="default" namespace="/" extends="struts-default">
		<action name="xyz" class="beans.xyz" method="execute">
			<result name="success" type="dispatcher">
				<param name="location">/abc.jsp</param>
				<param name="parse">true</param>
			</result>
		</action>
	</package>

上述指定了包在/路径下,action请求地址为xyz。
所以当表单的action="xyz"时,可请求指定的xyzAction类。
method指定了xyz类默认执行的方法。返回值为success,则会跳转到abc.jsp页面。

Struts框架业务控制器——Action类

基于Struts2的Web应用程序,action是程序的核心。并在struts.xml文件中配置Action。

实现Action类

Struts2对Action类没有特殊要求,可以是任意的Java类。Action类的实现方式有以下三种

  1. 普通的Java类
  2. 继承ActionSupport实现Action
  3. 对象属性驱动的Action

普通的Java类作为Action

可以创建任意一个Java类,但通常包含一个execute()普通方法,该方法没有任何参数,并返回字符串类型。用于< result>标签的判断。

继承ActionSupport实现Action

Struts2类库中的Action接口(Action.java)

	public interface Action{
		public static final String SUCCESS="success";
		public static final String NONE="none";
		public static final String ERROR="error";
		public static final String INPUT="input";
		public static final String LOGIN="login";
		public String execute() throws Exception;
	}

Struts2为Action接口提供了一个实现类ActionSupport。ActionSupport类是一个默认的Action实现类,有如下三个主要方法:

  1. void addFieldError(String fieldname,String errorMessafe):添加错误信息
  2. String execute():请求时,执行的方法需要重载???
  3. void validate():用于输入验证

实际开发中继承ActionSupport类,且重写execute()方法

对象属性驱动的Action

Struts2中的Action能自动将请求参数传递给对应的包含Setter方法的属性,但当页面请求参数较多时,把过多的参数属性定义在Action中不符合Struts所倡导的松耦合原则,较好的方法是使用JavaBean封装参数。

设计一个JavaBean类:Add.java
在这里插入图片描述

修改业务控制器,继承ActionSupport类:
在这里插入图片描述

修改input.jsp页面
在这里插入图片描述

Action访问Web对象

Struts2中,Action类和Web对象之间没有直接关系,但可以通过Action访问Web对象有四种方式

  • 直接访问Web对象——Servlet依赖容器方式
  • 通过ActionContext——Map依赖容器方式
  • 通过IoC访问Servlet——Map Ioc方式
  • 通过Ioc访问Servlet——Servlet IoC方式

直接访问Web对象——Servlet依赖容器方式

Struts2框架提供了org.apache.struts2.ServletActionContext辅助类来获得Web对象

例如获取request对象:

HttpServletRequest request = ServletActionContext.getRequest();

修改InputAction.java,将x、y、sum分别存放在request、session、aplication中

InputAction.java:
在这里插入图片描述
在这里插入图片描述

修改positive.jsp
在这里插入图片描述

通过ActionContext访问——Map依赖容器方式

ActionContext类位于com.opensymphony.xwork2中,提供一系列相关方法用于访问保存在ServletContex、HttpSession、HttpSevletRequest中的信息,并将访问结果存放在Map中。ActionContext类中的常用方法如下:

  • public static ActionContext getContext():获得ActionContext对象
  • public Object get(Object key):在ActionContext中查找key的值
  • public void put(Object key,Object value):向当前ActionContext存入值
  • public void setApplication(Map application):设置application的值
  • public void setSession(Map Session):设置session的值
  • public Map getParameter():从请求对象中获取参数
  • public Map getApplication():获取ServletContext中保存的Attribute
  • pulbic Map getSession():获取HttpSession中保存的Attribute
  • 注意 没有获取request对象的方法,所以需要在get(“request”)方法中找到request,如下所示。
	public class Action2{
		private Map<String,Object> request;
		private Map<String,Object> session;
		private Map<String,Object> application;
		private int x,y,sum;
		public Action2(){
			ActionContext context = ActionContext.getContext();
			request = (Map<String,Object>)context.get("request");
			session = context.getSession();
			application = context.getApplication();
		}
		、、、、、、、、、
		、、、、、、、、、
		public String execute(){
			sum = x+y;
			request.put("x2",x);
			session.put("y2",y);
			application.put("sum2",sum);
			if(sum>=0)
				return "+";
			else
				return "-";
		}
	}

通过IoC访问Servlet对象——Map IoC方式

Struts2框架中,通过IoC方式将Servlet对象注入到Action中,需要在Action中实现以下接口:

  1. org.apache.struts2.interceptor.RequestAware

该接口有void setRequest(Map map)方法,实现该方法的Action可访问HttpServletRequest对象

  1. org.apache.struts2.interceptor.SessionAware

该接口有void setSession(Map map)方法,实现该方法的Action可访问HttpSession对象

  1. org.apache.struts2.interceptor.ApplicationAware

该接口有void setApplication(Map map)方法,实现该方法的Action可访问ServletContext对象

例如:

业务控制器:InputAction3.java
实现ApplictionAware、SessionAware、RequestAware
在这里插入图片描述
重写接口的方法:
在这里插入图片描述
将属性压入Map:
在这里插入图片描述

通过IoC访问Servlet对象——Servlet IoC方式

IoC方式将Servlet对象注入到Action,需要在Action中实现以下三个接口:

  1. org.apache.struts2.interceptor.ServletContextAware

void setServletContext(ServletContext servletContext)方法,实现该接口的Action可以通过该方法获取ServletContext对象。

  1. org.apache.struts2.interceptor.ServletRequestAware

void setServletRequest(HttpServletRequest request)方法,实现该接口的Action可以通过该方法获取HttpServletRequest对象。

  1. org.apache.struts2.interceptor.ServletResponseAware

void setServletResponse(HttpServletResponse response)方法,实现该接口的Action可以通过该方法获取HttpServletSession对象。

例如:

业务控制器:InputAction4.java
这里实现一个接口,ServletRequestAware
在这里插入图片描述
利用HttpServletRequest对象,获取HttpSession和ServletContext对象:
在这里插入图片描述

多方法的Action

上述所定义的Action都是通过execute()方法自动完成处理请求的。虽然实现方便,但是Action数量巨多,struts.xml也要为每一个Action配置以下,非常臃肿。但在实际上可以用一个Action处理多个业务请求,并在struts.xml指定业务处理所采用的方法。

为Action配置多个method属性

可以在前端修改表单的提交请求,然后修改struts.xml配置文件中的action标签,每一个对应一个方法。

例如:

业务控制器:MethodsAction.java
在这里插入图片描述
配置文件struts.xml:
在这里插入图片描述

前端页面input5.jsp:
在这里插入图片描述
在这里插入图片描述
显示结果页面:show.jsp:
在这里插入图片描述

动态方法调用

动态方法调用直接在表单action属性指定需要调用的方法,如下格式:
< form action=“Action名字!方法名”>

例如:

修改上述input5.jsp页面如下:
在这里插入图片描述

修改struts.xml文件如下:
在这里插入图片描述
注意:需要在struts.xml添加两句话,启动动态方法调用
在这里插入图片描述

使用通配符映射方式

在struts.xml文件中配置action元素时,它的name、class、method属性都支持通配符。当使用通配符定义action的name属性时,相当于一个元素定义了多个逻辑Action

修改input5.jsp如下:
在这里插入图片描述

修改struts2.xml如下:
在这里插入图片描述

Struts2的OGNL表达式、标签库、国际化

Struts视图除了可以使用JSP、HTML、JavaScript和样式表等技术外,Struts2框架专门给出了自己的标签库、OGNL表达式和国际化处理方式。

Struts2的OGNL表达式

OGNL(对象图导航语言),可以通过简单的表达式访问Java对象中的属性。Struts2的默认表达式语言

Struts2的OGNL对象、属性及其访问

Struts2框架中的ActionContext是OGNL的根对象,即Action对象是OGNL的根对象。假设Action中有一个属性类型是Student(name,age),变量名为stu,那么访问属性name的OGNL表达式为:stu.name。

访问其他Context中的对象时,由于不是根对象,在访问时需要加"#"前缀。

  1. application:用于访问ServletContext属性
    #application
  2. session:用于访问HttpSession属性
    #session
  3. request:用于访问HttpServletRequest属性
    #request
  4. parameters:用于访问Http请求参数
    #parameters

Struts2的OGNL集合及其访问

OGNL集合可以实现List对象或者Map对象

  1. OGNL中使用List对象的格式
    p{e1,e2,e3,…}:生成一List对象包含,e1,e2,e2,…等元素
  2. OGNL中使用Map对象的格式
    #{key1:value1,key2:value2,key3:value3,…}:生成一个Map对象。

Struts的标签库

待补充

Struts的国际表达式

待补充

Struts拦截器

拦截器(Intercepter)是Struts2的核心组成部分。拦截器可以动态拦截Action调用的对象。
拦截器分为两类:Struts2提供的内建拦截器和用户自定义的拦截器。
Struts2拦截器就是Servlet中的过滤器

Struts2内建拦截器

Struts2用户自定义拦截器

为了实现自定义拦截器,Struts2提供了Interceptor接口。以及对该接口的一个抽象拦截器类AbstractInterceptor。Struts2还提供了一个MethodFilterInterceptor类,是AbstracteInterceptor类的子类,若要实现方法过滤,就需要继承MethodFilterInterceptor类。

如何实现用户自定义拦截器

实现用户自定义拦截器需要以下三个步骤:

  1. 创建一个实现Interceptor接口的类(或者继承AbstractInterceptor或继承MethodFilterInterceptor类)
  2. 在struts.xml中注册上一步中定义的拦截器。
  3. 在需要使用的Action中引用上述定义的拦截器

Interceptor拦截器接口

	import com.opensymphony.xwork2.ActionInvocation;
	import java.io.Serializable;
	public interface Interceptor extends Serializable{
		void destroy();
		void init();
		String intercept(ActionInvocation invocation)thorws Exception;
	}
  1. void destroy():用于在拦截器执行完之后,自动调用的。一般用于释放init()方法中打开的资源。
  2. void init():拦截器执行之前调用,用于初始化系统资源。
  3. String intercept(ActionInvocation invocation):实现具体的拦截操作,返回一个字符串作为逻辑视图。ActionInvocation对象的invoke()方法可以检查,是否还有拦截器,若有则继续调用余下的拦截器,若没有,执行Action

AbstractInterceptor抽象拦截器类

如上,AbstractInterceptor抽象拦截器类实现了Interceptor接口,方法一样

自定义拦截器

如上,自定义的拦截器类实现Interceptor接口或者继承AbstractInterceptor,方法一样

在Struts.xml中配置拦截器

自定义方法拦截器

案例——文字过滤器的设计

对一些发表不文明的语句,通过拦截器将不文明的文字进行自动替代。

评论页面:news.jsp:
在这里插入图片描述
显示评论页面:success.jsp
在这里插入图片描述

拦截器:MyInterceptor.java
在这里插入图片描述
Action:PublicAction.java
在这里插入图片描述

struts.xml
在这里插入图片描述

Struts2的文件上传和下载

在Struts2框架中,专门提供了文件上传、下载功能的两个包:commons-fileupload-x.x.x.jar和commons-io-x.x.x.jar。

Struts2的文件上传

使用Struts2上传文件时,只需使用普通Action类,但为了获取一些上传文件的信息,如上传文件名、文件类型,需要按照一定的规则在Action中增加一些getter和setter方法。实现文件的上传分为以下5个步骤:

  1. 编写上传页面,并设置表单的编码类型
  2. 编写上传页面业务处理类Action,定义三个变量,文件、文件名、文件类型
  3. 修改配置文件struts.xml,对Action进行配置
  4. 文件上传过滤
  5. 编写上传成功页面

上传页面:upload.jsp
在这里插入图片描述

Action处理页面:FileUpload.java
在这里插入图片描述
在这里插入图片描述
struts.xml

在这里插入图片描述

上传成功页面:uploadSuccess.jsp
在这里插入图片描述
在这里插入图片描述
上传失败页面:error.jsp
在这里插入图片描述

Struts2的文件下载

Struts2的文件下载会使用到commons-io-x.x.x.jar包。注意:若下载的文件名为中文名,需要编码转换;下载之前进行进一步检查,判断用户有没有足够的权限下载该文件,此功能暂不实现。利用Struts2下载文件,需要以下三个步骤:

  1. 编写下载页面
  2. 编写Struts2实现文件下载 的Action
  3. 修改struts.xml。

下载页面:
在这里插入图片描述

Action:DownloadAction.java
在这里插入图片描述

编写struts.xml
在这里插入图片描述

Struts2的输入验证

Struts2提供了安全的服务器验证方法,一种是使用validate()方法,另一种是配置验证(使用配置验证文件)。

使用validate()方法实现验证

在Struts2框架中,validate()方法是专门用来验证数据的,实现该方法,需要继承ActionSupport类然后,重写validate()方法。

使用验证文件实现验证

Struts2框架还提供了一种基于验证文件的输入验证方式,将验证规则保存在特定的验证文件中。

验证文件的命名规则

Acion类名-validation.xml,放在和Action类同一个文件夹下

校验器怎么写

校验器分为字段校验器和非字段校验器

字段校验器

校验文件类型以< field>元素为基本元素,这个基本元素的name属性指定被校验的字段

	<validators>
		<field name="被校验的字段">
			<!--用来指定校验器的类型-->
			<field-validator type="校验器的类型">
				<!--用来向校验器传递参数,可包含多个-->
				<param name="参数名">参数值</param>
				<!--用来检验失败的提示消息-->
				<message>信息</message>
			</field-validator>
		</field>
		<!--下一个字段校验器-->
		........
	</validators>

非字段校验器

直接指定校验器的类型

	<validators>
		<!--指定校验器类型-->
		<validator type="指定类型">
			<!--指定校验的属性-->
			<param name="fildName">需要被检验的字段</param>
			<param name="参数">参数指</param>
			<!--校验失败提示信息-->
			<message>信息</message>
		</validator>
		<!--下一个校验器-->
	</validators>

案例——实现客户注册输入验证

用validate()方法对注册页面的信息输入验证。实现步骤如下:

  1. 创建注册用户的JavaBean类
  2. 创建读写数据库类(此处不实现)
  3. 创建业务控制器,完成对输入信息的验证
  4. 编写注册页面
  5. 编写结果显示页面

创建注册用户的JavaBean类
在这里插入图片描述

业务控制器:RegisterAction.java
在这里插入图片描述
在这里插入图片描述

注册页面:register.jsp
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

struts.xml
在这里插入图片描述

@syl 2021/07/11 0:01 黑 抽烟

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-11 16:30:26  更:2021-07-11 16:32:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 6:05:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码