Struts2 入门

Struts2入门第一讲——Struts2框架的快速入门 Struts2框架的概述Struts2是一种基于MVC模式的轻量级Web框架,它自问世以来,就受到了广大Web开发者的关注,并广泛应用于各种企业系统的开发中。目前掌握Struts2框架几乎成为Web开发者的必备技能之一。接下来将针对Struts2的特点、安装以及执行流程等内容进行详细的讲解。什么是Struts2先讲Struts2框架之前,我们得知道JavaEE一共有三层架构,如下: 架构名称 阅读详情

1、原理

可参考:http://blog.youkuaiyun.com/laner0515/article/details/27692673/ 、 http://blog.youkuaiyun.com/wuwenxiang91322/article/details/11070513

2、第一个项目——HelloWorld

(1)步骤:

①建立web项目,拷贝struts-2.5.10.1-min-lib/lib中的jar包。还需添加一个log4j-core


②在web.xml中配置Struts2的前端控制器-StrutsPrepareAndExecuteFilter

③定义一个POJO类:HelloAction

public class HelloAction {

	public String sayHello(){
		System.out.println("Hello World!");
		//返回逻辑视图
		return "success";
	}
}
④拷贝struts.xml文件到项目的类路径或资源文件中,文件名不能修改


但可以针对每个action类设定一个struts的xml配置文件,该文件可改名字


但是在struts.xml配置文件中需要引入该配置文件

	<include file="\action\helloworld\struts-hello.xml"></include>

⑤在struts.xml文件中,配置HelloAction.(把HelloAction交给Struts框架管理)


⑥访问Action

协议+主机地址+端口号+上下文路径+命名空间(namespace)+资源名称(action name)

3、Struts2中的6大配置文件

(1)Struts2框架按照如下顺序加载struts2配置:
①default.properties 该文件保存在 struts2-core-2.5.10.1.jar 中 org.apache.struts2包里面:包含了Struts2的默认常量配置
②struts-default.xml 该文件保存在 struts2-core-2.5.10.1.jar:包含了框架依赖的对象配置和结果类型,拦截器等配置.
③struts-plugin.xml 该文件保存在Struts2框架的插件中:struts-Xxx-2.5.10.1.jar.由插件提供

上述三个文件时框架自带的,不能修改,只能使用。
---------------------------------------------------------
④struts.xml 该文件是web应用默认的struts配置文件.重点.配置自定义的Action和其他信息.
⑤struts.properties 该文件是Struts的默认配置文件-->可以修改default.properties 的常量配置.
⑥web.xml 该文件是Web应用的配置文件

上述三个文件是可以修改操作的。
---------------------------------------------------------
如果多个文件配置了同一个struts2 常量,则后一个文件中配置的常量值会覆盖前面文件配置的常量值.
注意:一般在struts.xml中做常量配置.

4、常见常量配置

(1)指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法和freemarker 、velocity的输出
<constantname="struts.i18n.encoding" value="UTF-8"/>

(2)指定需要Struts2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开

<constant name="struts.action.extension" value="action,,"/>

(3)开发模式下使用,这样可以打印出更详细的错误信息
<constant name="struts.devMode" value="true" />:修改struts.xml之后,不需要重启Tomcat.

5、struts.xml配置文件元素详解

(1)package元素—— <struts>根元素的子元素

用来对多个<action>元素分类管理,和Java中的package没有关系.

①常见的属性:
name: <package>的名字
extends: 表示当前<package>继承哪一个<package>,一般都是:struts-default。而struts-default其实就是struts-default.xml中<package>元素的名字,继承struts-default之后,就拥有了该<package>定义的所有资源.(结果返回类型,拦截器..)
namespace: 表示命名空间,一般的以"/"打头.,命名一般以模块名.如: /crm, /oa. 和<action>的name决定了一个Action类的访问路径.
abstract: 抽象的,缺省值是false. 若一个<package>的abstract="true",那么该<package>中就不能再定义<action>元素,只能用来继承.

(2)action元素——<package>元素的子元素

专门用来配置Action类的,理论上一个Action类匹配一个<action>元素.
<action name="" class="" method=""/>

①常见的属性:
name: action的名称,在同一个<package>中,action的名字必须唯一. 和<package>的namespace共同决定了一个Action类的访问路径.
注意:action的name值不能以"/"打头.
class:一个Action类的全限定名. 缺省值:com.opensymphony.xwork2.ActionSupport类.


method:当前Action动作访问的方法, 缺省值:execute.
如果不填class和method,默认会找com.opensymphony.xwork2.ActionSupport类的execute方法

(3)result元素——配置结果视图

①局部结果视图:<result>定义在<action>中。优先级较高

②全局结果视图:<result>定义在<global-results>中,而<global-results>在<package>中


③常见的属性:
name:Action方法返回的逻辑视图名称. 缺省值:success
type:结果的跳转类型.该类型的值在struts-default.xml中已经预定义好了. 缺省值:dispatcher

常见的type值(结果类型):
dispatcher: 表示从Action请求转发到页面(JSP).
redirect: 表示从Action重定向到页面(JSP).
chain: 表示从Action请求转发到另一个Action.
redirectAction: 表示从Action重定向到另一个Action.


stream: 表示返回流. 文件下载时使用.

6、创建Action类的三种方式

(1)使用公共的POJO类作为Action. 提供公共的无参数的Action方法.(不推荐).

①缺点:
没有一种方式约束Action方法必须是公共的无参数的.
Action方法的返回逻辑视图名可以自定指定. 有时起名不规范. 比如:"ooxx".


(2)定义一个类,实现于com.opensymphony.xwork2.Action接口.并覆写execute方法即可.(不推荐)

①缺点: 不支持国际化,数据校验,消息机制


(3)定义一个Action类,继承于com.opensymphony.xwork2.ActionSupport类.(推荐)


7、Action多方法调用

(1)原始方式

StudentAction.java

public class StudentAction extends ActionSupport{

	private static final long serialVersionUID = 1L;
	public String list(){
		System.out.println("学生列表");
		return NONE;
	}
	public String save(){
		System.out.println("添加学生");
		return NONE;
	}
	public String delete(){
		System.out.println("删除学生");
		return NONE;
	}
	public String update(){
		System.out.println("更新学生");
		return NONE;
	}
}

Action中多个Action方法会造成<action>配置的臃肿。


(2)解决方案:
方案1: DMI:动态方法调用 :官方不推荐

格式:  action名!方法名

缺点:不安全,调用需要使用方法名。

在Struts2新的版本中,默认的关闭了DMI.若我们需要使用DMI,就需要在struts.xml配置常量,启用动态方法调用.


此时:<action/>元素不需要指定method属性值.

测试:


方案2: 使用通配符的方式类配置: 通配符:*
①使用单个通配符


测试:



②使用多个通配符


测试:


8、访问ServletApi

有三种方式

(1)通过让Action类去实现感知接口(ServletRequestAware、ServletResponseAware、ServletSessionAware)

缺点:和ServletAPI藕合严重

eg:

①getServletApi1Action.java

public class getServletApi1Action extends ActionSupport implements ServletRequestAware,ServletResponseAware{

	private static final long serialVersionUID = 1L;
	private HttpServletResponse resp;
	private HttpServletRequest req;
	public String execute(){
		System.out.println(req.getParameter("username"));
		return NONE;
	}
	@Override
	public void setServletResponse(HttpServletResponse resp) {
		this.resp = resp;
	}
	@Override
	public void setServletRequest(HttpServletRequest req) {
		this.req = req;
		
	}
}
②struts.xml

<struts>
	<package name="getServletPkg" extends="struts-default"
		namespace="/getServlet">
		<action name="api1" class="action.getServletApi.getServletApi1Action">
		</action>
	</package>
</struts>
③测试:



实现原理:

通过拦截器实现



(2)使用ServletActionContext类,该类提供很多静态方法可以返回Servelet API对象

eg:

①getServletApi2Action.java

public class getServletApi2Action extends ActionSupport {

	private static final long serialVersionUID = 1L;
	public String execute() {
		HttpServletRequest req = ServletActionContext.getRequest();
		req.setAttribute("requestName","requestVal");
		HttpSession session = ServletActionContext.getRequest().getSession();
		session.setAttribute("sessionName", "sessionVal");
		ServletContext context = ServletActionContext.getServletContext();
		context.setAttribute("contextName","contextVal");
		return SUCCESS;
	}
}

②struts.xml

<struts>
	<package name="getServletPkg" extends="struts-default"
		namespace="/getServlet">
		<action name="api2" class="action.getServletApi.getServletApi2Action">
		<result>/views/getServletApi/getServlet.jsp</result>
		</action>
	</package>
</struts>

③getServlet.jsp

<h3>使用ServletActionContext</h3>
<hr>
request:${requestName}
<br>
session:${sessionName}
<br>
servletContext:${contextName}
<br>
④测试:


(3)使用ActionContext类,本身是Struts2对Servlet API的封装.(推荐使用)

ActionContext:——Action的环境对象,每一次请求都是一个新的Action对象,一个ActionContext对象封装了这一次请求的相关数据.
ActionContext使用了ThreadLocal模式,所以说是线程安全的.

eg:

①getServletApi3Action.java

public class getServletApi3Action extends ActionSupport{

	private static final long serialVersionUID = 1L;
	public String execute(){
		ActionContext context = ActionContext.getContext();
		context.put("requestKey","requestValue");
		context.getApplication().put("appKey","applicationVal");
		context.getSession().put("sessionKey","sessionValue");
		return SUCCESS;
	}
}

②struts.xml

<struts>
	<package name="getServletPkg" extends="struts-default"
		namespace="/getServlet">
		<action name="api3" class="action.getServletApi.getServletApi3Action">
		<result>
			/views/getServletApi/getServlet.jsp
		</result>
		</action>
	</package>
</struts>

③getServlet.jsp

<h3>使用ActionContext</h3>
<hr>
request:${requestKey}
<br>
session:${sessionKey}
<br>
servletContext:${appKey}
<br> <hr>
④测试:


9、Action获取请求参数

两种方式:

(1)Action本身作为Model对象,通过setter方法封装(属性注入)

①把Action本身作为一个领域模型;
②要求页面提交的参数名称和Action中对应属性名称相同(只需要有属性的setter方法即可),但是如果把Action本身当成模型,则也需要提供相应的getter方法;
③该功能是由拦截器完成的;并且自带类型转换;
④在Servlet中,因为线程安全的问题,不能在Servlet中定义成员变量;但是在Struts2中,Action是每次请求都重新创建,所以肯定在Action中定义模型属性;
优点:简单;缺点:如果模型参数过多,Action中的属性会非常多,就会把模型和业务混淆在一起;
eg:

①GetParameterAction.java

public class GetParameterAction extends ActionSupport {
	private static final long serialVersionUID = 1L;
	
	private String username;
	private String password;
	@Override
	public String execute() throws Exception {
		System.out.println("username:"+username);
		System.out.println("password:"+password);
		
		return NONE;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getUsername() {
		return username;
	}
	public String getPassword() {
		return password;
	}
}
②struts.xml

<struts>
	<package name="getparamPkg" extends="struts-default" namespace="/">
		<action name="login1" class="action.getParam.GetParameterAction"/>
	</package>
</struts>
③getParam.jsp

<fieldset>
	<legend>Action本身作为Model对象,通过setter方法封装</legend>
	<form action="${pageContext.request.contextPath}/login1" method="post">
		账户:<input type="text" name="username"><br> 密码:<input
			type="text" name="password"><br> <input type="submit"
			value="登陆">
	</form>
</fieldset>
④测试:


(2)创建独立Model对象,页面通过ognl表达式封装(属性注入)

两种写法:
i.一个字段,并提供对应的getter和setter;
ii.一个字段,action自己new出来,并提供getter方法;
优点:action和model责任分离;缺点:页面必须按照和domain一致的规则来写;
①User.java

public class User {
	private String age;
	private String username;
	private String password;
	
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password + "]";
	}
}
②GetParameterAction2.java

public class GetParameterAction2 extends ActionSupport {
	private static final long serialVersionUID = 1L;
 
	private User user;
       //自己new出来,并提供getter方法
       //private User user = new User();
       @Override
	public String execute() throws Exception {
		System.out.println("username:  "+user.getUsername());
		System.out.println("password: "+user.getPassword());
		System.out.println("age: "+user.getAge());
		return NONE;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public User getUser() {
		return user;
	}
}
③struts.xml

	<package name="getparamPkg" extends="struts-default" namespace="/">
		<action name="login2" class="action.getParam.GetParameterAction2"/>
	</package>
④getParam.jsp

 <fieldset>
	<legend>创建独立model对象,页面通过ognl表达式封装</legend>
	<form action="${pageContext.request.contextPath}/login2" method="post">
		账户:<input type="text" name="user.username"><br> 密码:<input
			type="text" name="user.password"><br> <input type="submit"
			value="登陆">
	</form>
</fieldset>
⑤测试



注意:


如果Action中没有user的getter方法会出现什么情况?

针对两种写法:
i.一个字段,并提供对应的getter和setter;

以该例子注入username为例,找到user.username,在Action类中寻找user属性,判断user是否为空,若为空则创建一个,调用setUser方法,然后调用user.setUserName方法注入数据到user模型。然后继续处理user.password,判断user是否为空,若为空则创建一个,此时如果没有提供getter方法,则无法取得user对象,继续创建,那么前面注入的数据将会丢失。

ii.一个字段,action自己new出来,并提供getter方法;

此时无需setUser方法,因为已经自行创建(user不为空)但仍然需要提供getter方法,否则无法取出user对象,设置值或取出值无法进行。


Struts2快速基础入门实战指南 本文还有配套的精品资源,点击获取 简介:Struts2是一个基于MVC架构的Java Web应用程序框架,它简化了开发过程并提供了对控制流的更好控制。本文是一个初学者友好型的快速入门指南,将引导读者了解Struts2的核心概念,包括Action类、配置文件、MVC模式、拦截器、ValueStack、OGNL表达式语言以及结果类型。教程将一步步带领读者构建一个简单的Strut... 阅读详情

相关推荐

M2DGR数据集在主流SLAM框架中的实战配置指南:从ORB-SLAM到FAST-LIO的完整流程

本文提供了M2DGR多传感器数据集在主流SLAM框架中的实战配置指南。详细介绍了从ORB-SLAM、VINS-Mono等视觉/视觉惯性框架,到A-LOAM、FAST-LIO等激光/激光惯性框架的完整配置流程、参数调整要点及常见问题解决方案。通过实际测试对比,分析了各算法在M2DGR数据集上的表现,为机器人定位与建图研究提供了宝贵的实战经验。

k9l0m1的博客 481

Struts2如何在Action中获取当前访问Action的名称

获取的方式很简单: public String getActionName() { //获取action名称 String actionName = ActionContext.getContext().getName(); return actionName; }  

mmmgdzl的博客 959

高速电路设计必看:同步开关噪声问题解析

数字电路中的同步开关噪声(SSN)问题日益突出,尤其是随着高速器件应用增多。本文分析了地弹和电压弹的产生机理,指出其与电源网络电感、输出驱动电流变化率密切相关。文章详细阐述了地弹参数特征,包括峰值电压、脉冲宽度等关键指标,并探讨了负载电容、信号压摆率等因素对地弹的影响。最后提出系统化的解决方案,涵盖芯片选型、电路设计、PCB布局和后期调试等多个环节,强调通过降低回路电感和控制电流变化率来有效抑制SSN。这些措施需要在性能、成本和复杂度之间取得平衡,为高速数字电路设计提供了重要参考。

一只豌豆象的博客 297

structs2 中关于struts2.xml文件中的action和result标签

在action标签中,有一个method的属性,通过该属性,调用类中的具体方法。但如果没有说明该属性,则默认会调用execute()方法。 而在result标签中,name属性默认值为success。且只有当返回值等于name属性值时,才可以访问到result标签中的jsp页面。 但是,如果在action标签中没有说明method属性,理论上默认调用的是execute()方法,而在result

i_myxxx的博客 1205

【WRFDA教程】客观分析(OBSGRID)详解

客观分析(OBSGRID)详解

WW、forever的博客 1133

ASProxy64.dll导致jetbrains家的IDE都无法打开。

摘要:在Windows11系统中,JetBrains IDE无法启动,报错指向ASProxy64.dll文件。该第三方DLL被注入到JVM原生层,导致内存访问冲突(错误代码0xc0000005)。经排查发现此文件来自Astrill软件。解决方案为卸载Astrill后重启电脑,问题得以解决。该案例表明第三方DLL注入可能影响IDE正常运行,卸载相关软件是最直接的解决方法。(149字)

猿小白的博客 936

Struts2 - Interceptor中取得ActionName、Namespace、Method

在Struts2的Interceptor中取得当前执行对应的ActionName、Namespace、Method方法: 可以使用: System.out.println(invocation.getProxy().getNamespace()); System.out.println(invocation.getProxy().getActio...

weixin_30911451的博客 146

Vue3 - 完美解决 vite 打包后在本地浏览器直接打开运行,build 打包后双击 index.html 直接以 file 协议运行网站(资源、接口等正常访问,和部署到服务器运行效果一样)

vue3vite怎么支持file协议本地打开,vite打包文件如何支持files协议,支持双击即可打开网页,vue3vite打包后双击本地运行,vue3vite打包后怎么直接在浏览器双击打开访问,vite打包后显示空白,vite如何支持本地file协议打开,vue3vite打包后如何本地查看网站,vue3vite项目打包后本地启动白屏怎么办,vite打包后的代码如何在本地运行,vite+vue3打包在fIle本地index.html打开项目,打包后如何直接打开index.html文件,vue3

🏆 前端领域优质创作者 1万+

struts2有没有办法在服务端得到请求action的名称?

转自: http://www.iteye.com/problems/98044 第一一个Interceptor(判断用户权限的时候经常使用)   代码如下    public class MyInterceptor extends AbstractInterceptor {  public String intercept(ActionInvocat

mumushuiding的博客 375

手把手教你学simulink(13.2)--构建一个单相并网逆变器Simulink仿真模型

基于Simulink的单相并网逆变器项目的详细仿真实例。这个项目将重点放在逆变器的详细建模、最大功率点跟踪(MPPT)控制策略、并网控制和仿真分析上。我们将使用MATLAB/Simulink来构建整个系统,并通过具体的代码和模块来实现各个功能。

MHD0815的博客 545

【文献笔记】CVPR 2023|Attention-Based Point Cloud Edge Sampling

优点能够有效采出点云数据的边缘点分类任务性能优越不足没有设计出一个更好的上采样方法,导致分割任务的性能略低只考虑了边缘特征,没有利用其他几何特征。

m0_55908255的博客 319

Struts2中获取所有Action对应的Name的方式

写道 Dispatcher dispatcher = Dispatcher.getInstance(); ConfigurationManager cm = dispatcher.getConfigurationManager(); Configuration cf = cm.getConfiguration(); RuntimeConfiguration rc = cf.getRunt...

lpluck08的专栏 330

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Struts2框架简单入门

Struts2入门

qq_42640067的博客 7744

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Struts2入门

1首先创建一个Maven项目 找到里面的pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersi

qq_64230952的博客 634

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

struts2 入门

struts入门环境搭建jarweb.xmlstruts.xmlstruts.xml(核心配置文件)Action参数赋值与J2EE容器交互非注入注入核心文件配置动态方法调用 环境搭建 jar 基本目录结构展示: web.xml <!-- 修改web.xml由2.3至3.1 --> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javae...

qq_44641053的博客 560

关于struts2的入门chm文档

关于struts2入门的chm文件和struts2的api文档,供下载。

duqiangcise 140

struts2(一) struts2入门

struts2(一) struts2入门

程序员大海的博客 155

Struts2的快速入门

1. Struts2框架的概述 Struts2是流行和成熟的基于MVC设计模式的Web应用程序框架。 Struts2不只是Struts1下一个版本,它是一个完全重写的Struts架构。 WebWork框架开始以Struts框架为基础,其目标是提供一个加强和改进框架Struts来使web开发的开发人员更容易 2. Struts2的快速入门 1.去官网下载Struts2的开发环境包 Struts2...

xiayubao7788的博客 392

struts2的入门

文章目录Struts2的入门解压Struts2开发包创建web项目,引入jar包创建一个JSP页面编写Action的类对Action进行配置配置前端控制器(核心过滤器)改写Action中的方法的返回值改写struts.xml编写success.jspStruts2的常见配置XML的提示问题Struts2的配置文件的加载顺序Struts2的配置文件加载顺序加载顺序Action的配置package相关...

qq_42216575的博客 185

struts2入门

struts入门 一、第一步:创建maven项目 创建项目: https://blog.youkuaiyun.com/qq_44224029/article/details/99757077 二、第二步,了解struts Struts2是一个兼容Struts1和WebWork的MVC框架(struts是属于web层的MVC框架),既然,提到了MVC框架,就不得不对MVC框架做一个简单介绍,仅限于简单介...

鄧旧人博客 305

快速入门Struts2㊀一个案例入门Struts2

1 Struct2 ? 2 一个案例入门Struct2 2.1 搭建项目环境 2.2 配置核心过滤器(web.xml) 2.3 添加用户.jsp与用户列表.jsp 2.4 编写action类 2.5 配置核心配置文件(struts.xml) 3 执行过程分析 4 本文代码资源下载 1 Struct2 ? Struct2是一个基于MVC设计模式的Web应用层框架。 ...

优快云 650

Struts2的入门案例(一)

博主秋招提前批已拿百度、字节跳动、拼多多、顺丰等公司的offer,可加微信:pcwl_Java一起交流秋招面试经验,可获得博主的秋招简历和复习笔记。 第一步:创建一个WEB工程,引入相关jar包,struts2-blank.war是一个struts2的空工程,将其解压后,将其lib下的所有jar包拷入工程。 第二步:创建页面 在WebContent下创建两个jsp页面,分别为dem...

Java学习 4263
上一篇: Spring3.2—— BeanPostProcessor、BeanFactoryPostProcessor
下一篇: Struts2——拦截器(Interceptor)
ack_Finding
博客等级 码龄10年 6粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值