Java学习笔记:Struts2初学

Struts2的文档结构:
WebRoot——WEB-INF——classes——class.files
——struts.xml
——web.xml
——lib
——JSP
——Static Resources

Struts的框架结构:


web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>firststruts</display-name>
  <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!-- 
	package:包,用于对Action进行封装
	1.name:包名,根元素下可以有多个包,彼此之间不能重名。
	2.extends:继承,用于指定继承的包,相当于将继承包下的配置信息复制到了当前包下。
	3.namespace:命名空间,用于规定Action的访问路径,必须以"/"开头。
	4.请求Action时,按照如下格式拼写URL:
	http://IP:PORT/ProjectName/NAMESPACE/ACTIONNAME.action
 -->
	<package name="day01" namespace="/demo" extends="struts-default">
	<!-- 
		action:业务控制器,用于注册业务控制器组件(类)。
		1.name:action名称,用于规定Action的访问路径。一个包下可以有多个action,彼此不能重名。
		2.class:业务控制器组件,用于指定业务控制器对应的类。
		3.method:方法,用于指定访问当前action时要调用的方法。
	 -->
		<action name="hello" class="action.HelloAction" method="sayHello">
		<!-- 
			result:输出组件,用于转发、重定向、直接输出。
			1.name:名称,一个action下可以有多个result,彼此之间不能重名。
			2.默认做转发,标记内容设置成转发的页面。
		 -->
			<result name="success">
				/hello.jsp
			</result>
		</action>
	</package>
</struts>    
OGNL
Object Graph Navigation Language,是一门功能强大的表达式语言,类似于EL。
Struts2默认采用OGNL表达式访问Action的数据,实际上是通过ValueStack对象来访问的Action。
OGNL表达式

1.访问基本属性 

<h2>ID:<s:property value="id"/></h2>
<h2>Name:<s:property value="name"/></h2>

2.访问实体对象

<h2>用户名:<s:property value="user.username"/></h2>
<h2>密码:<s:property value="user.password"/></h2>

3.访问数组/集合

<h2>数组中的城市:<s:property value="cityArray[1]"/></h2>
<h2>集合中的城市:<s:property value="cityList[1]"/></h2>

4.访问Map

<h2>Map中的城市人口:<s:property value="cityMap.beijing"/></h2>

5.运算

<h2>My Name:<s:property value="'My name is '+name"/></h2>
<h2>去哪:<s:property value="cityArray[1]+',我来了!'"/></h2>

6.调用方法

<h2>MY NAME:<s:property value="name.toUpperCase()"/></h2>

7.常见集合

<h2>创建集合:<s:property value="{'a','b','c'}"/></h2>
<h2>集合类型:<s:property value="{'a','b','c'}.getClass().getName()"/></h2>

8.创建Map

<h2>创建Map:<s:property value="#{'mm':'MM','nn':'NN'}"/></h2>
<h2>Map类型:<s:property value="#{'mm':'MM','nn':'NN'}.getClass().getName()"/>
演示结果
1.基本属性
ID:1
Name:zhangsan
2.实体对象
用户名:zhangsan
密码:123456
3.数组和集合
数组中的城市:shanghai
集合中的城市:chongqing
4.Map
Map中的城市人口:2300万人口
5.访问时运算
My Name:My name is zhangsan
去哪:shanghai,我来了!
6.访问时调用方法
MY NAME:ZHANGSAN
7.创建集合
创建集合:[a, b, c]
集合类型:java.util.ArrayList
8.创建Map
创建Map:{mm=MM, nn=NN}
Map类型:java.util.LinkedHashMap

ValueStack
ValueStack是Struts2中,Action向页面传递数据的媒介。ValueStack封装了Action的数据,并允许JSP通过OGNL来对其进行访问。

1.观察ValueStack结构

<h2><s:debug/></h2>

2.输出栈顶内容

<h2>Stack Top:<s:property/></h2>

3.输出Context对象中的数据

<h2>context:<s:property value="#action.user.username"/></h2>

4.遍历集合

<!-- 迭代标签 遍历集合 -->
<s:iterator value="emps">
	<!-- 迭代过程中,栈顶为Emp对象,写出OGNL输出其属性值。 -->
	员工:<s:property value="empName"/>
	工资为:<s:property value="salary"/><br/>
</s:iterator>

5.按数字迭代

<!-- 迭代标签,按数字迭代 -->
 <s:iterator begin="from" end="to" var="p">
 	<!-- 迭代过程中,栈顶为数字,但不能以数字为root写OGNL。此时可以声明变量p,通过Context对象实现对变量的访问。 -->
 	<s:property value="#p"/>
 </s:iterator>
演示结果
1.观察ValueStack结构
[Debug]


2.栈顶
Stack Top:action.HelloAction@4959b3a2
3.输出context对象中的数据
context:zhangsan
4.遍历集合
员工:刘备 工资为:8000.0
员工:关羽 工资为:6000.0
员工:张飞 工资为:5000.0
5.循环数字
1 2 3

获取Session的方式
• ActionContext
○ ActionContext.getContext().getSession()
○ 返回类型为Map<String,Object>
• ServletActionContext
○ ServletActionContext.getRequest().getSession()
○ 返回类型为HttpSession
• SessionAware
○ 让Action实现SessionAware接口
○ 实现void setSession(Map<String,Object> session)方法,Struts2会在实例化Action后调用该方法,通过方法参数将Session对象注入进来
○ 定义成员变量,接收注入进来的Session对象

请求不用处理业务,Action类可以省略,在配置时class可以不指定,Struts2默认会实例化ActionSupport类,该类提供了默认业务方法execute并返回success。
默认类ActionSupport是在struts-default.xml中设定的。

Result组件
Result是用于做输出的组件,用于向页面输出一些内容,转发、重定向可以理解为特殊方法的输出。每一个Result实际上就是一个类,这些都实现了共同的接口Result
Struts预置了10种类型的Result,他们被定义在struts-default.xml中。
• dispatcher
○ 用于转发的Result,可以将请求转发给JSP
○ 此种类型Result对应的类为ServletDispatcherResult
○ 此类Result是Struts2默认的Result类型,该默认行为是定义该Result时,通过default="true"指定的
○ 在此之前,我们使用的Result都是这种默认的Result
• stream
○ 用于向页面输出二进制数据,此种类型的Result,可以将二进制数据输出到请求发起端
○ 此种类型Result对应的类为StreamResult

○ 创建输出流,接到Action中定义的输入流将其输出

<result name="success" type="stream">
    <param name="inputName">codeStream</param>
</result> 
• redirectAction
○ 用于将请求重定向给另一个Action

○ 此种类型Result对应的类为ServletActionRedirectResult

<result name="login" type="redirectAction">
    <param name="namespace">
        /命名空间
    </param>
    <param name="actionName">
        action名
    </param>
</result>
• json
○ 用于向页面输出json格式的数据,此种类型的Result,可以将json字符串输出到请发起端
○ 此种类型Result对应的类为JSONResult
○ 此类Result不是Struts2默认的Result,但是的确是十分常用的类型
○ 输出一个Action属性
<result name="success" type="json">
    <param name="root">属性名</root>
</result>
○ 格式
□ 指定属性为基本类型,则直接返回该属性值
□ 如果指定属性为实体对象,则返回格式如{"code":"bj01","name":"zs"}

○ 输出多个Action属性

<result name="success" type="json">
    <param name="includeProperties">
        属性名1,属性名2,属性名3,…
    </param>
</result>
格式
□ 将Action中多个属性,做成json字符串,格式如{"id":"15","age","28"}

○ 输出所有Action属性

<result name="success" type="json">
</result>
□ 格式
□ 将Action所有属性做成json字符串,格式如{"id":15,"name":"zs",age":"28","salary":8000}
○ 使用步骤
□ 导包
□ 修改包继承关系
□ 在struts.xml中,将Action所在package的继承改为json-default
□ 配置Action
□ 在struts.xml中,配置Action及Result
□ 异步请求
□ 在页面上发送异步请求,访问Action
□ 在JS回调函数中,处理请求返回结果
• FreeMarker
• chain
• HttpHeader
• Redirect
• Velocity
• XLS
• PlainText

拦截器
使用拦截器实现以下操作:
• 在调用action之前提供预处理逻辑。
• 在调用action后提供后处理逻辑。
• 捕获异常,以便可以执行备用处理。
Struts2框架拦截器
alias 允许参数在请求之间使用不同的别名。
checkbox 通过为未检查的复选框添加参数值false,以辅助管理复选框。
conversionError 将字符串转换为参数类型的错误信息放置到action的错误字段中。
createSession 自动创建HTTP会话(如果尚不存在)。
debugging 为开发人员提供一些不同的调试屏幕。
execAndWait 当action在后台执行时,将用户发送到中间的等待页面。
exception 映射从action到结果抛出的异常,允许通过重定向自动处理异常。
fileUpload 便于文件上传。
i18n 在用户会话期间跟踪选定的区域。
logger 通过输出正在执行的action的名称提供简单的日志记录。
params 设置action上的请求参数。
prepare 这通常用于执行预处理工作,例如设置数据库连接。
profile 允许记录action的简单分析信息。
scope 在会话或应用程序范围内存储和检索action的状态。
ServletConfig 提供可访问各种基于servlet信息的action。
timer 以action执行时间的形式提供简单的分析信息。
token 检查action的有效性,以防止重复提交表单。

validation 提供action的验证支持。

创建拦截器组件

public class MyInterceptor extends AbstractInterceptor {
	public String intercept(ActionInvocation invocation) throws Exception {
		//前部分处理
		String output = "Pre-Processing";
		System.out.println(output);
		String result = invocation.invoke();
		//后续处理
		output = "Post-Processing";
		System.out.println(output);
		return result;
	}
}

注册拦截器

<package name="helloworld" extends="struts-default">
      <interceptors>
         <interceptor name="别名"
            class="实现类" />
      </interceptors>
</package>

引用拦截器

<action name="hello"  class="cn.w3cschool.struts2.HelloWorldAction" method="execute">
	<interceptor-ref name="params"/>
	<interceptor-ref name="拦截器" />
	<result name="success">/HelloWorld.jsp</result>
</action>

拦截器堆栈

<interceptor-stack name="basicStack">
   <interceptor-ref name="exception"/>
   <interceptor-ref name="servlet-config"/>
   <interceptor-ref name="prepare"/>
   <interceptor-ref name="checkbox"/>
   <interceptor-ref name="params"/>
   <interceptor-ref name="conversionError"/>
</interceptor-stack>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值