框架 day27 Struts2 入门(概述,基本xml配置,动态方法调用,Action类,ServletAPI访问,结果集)

Struts2 入门

引入

 

框架:就是半成品,框架已经完成一些通用功能。只需要实现与业务有关功能

版本:struts-2.3.15.3-all

 

Struts2在开发中所处的位置


M:模型

V:视图

C:控制器(之前使用的是Servlet)

*Servlet可以作为控制器,Filter也可以作为控制器,而且功能比Servlet要强大,强大在Filter能根据条件决定是否放行

 

Struts2简介

Struts1和WebWork技术基础合并的全新框架

WebWork为核心,采用拦截器机制(使得业务逻辑控制器与ServletAPI脱离)

 

核心功能

Action: 可以是同POJO(Plain Old Java Objects) //既普通类 JavaBean为特殊类

线程:Action一个请求对应一个实例,无线程安全问题 //对比Servlet为单例,有线程安全问题

Servlet依赖:可以访问ServletAPI,但不再依赖,实现TDD(测试驱动开发)

封装请求参数/整合OGNL(比EL更强大的表达式)/数据校验

绑定值到视图:ValueStack值栈

基于Spring AOP思想的拦截器,易于扩展

 

目录结构

apps:应用程序(案例)

docs:帮助文档

lib:jar包

src:源码

 

apps / struts2-blank.war 最简环境

apps / struts2-showcase.war常见案例

war 只要放在 tomcat/webapps/ 将自动解压,并可以访问

 

jar包介绍(最简)


 

Struts2-Hello Struts2 案例

 

流程

导入jar包→Action类(请求处理类)→核心配置文件:struts.xml(src下既WEB-INF/classes下)→web.xml配置过滤器→测试

 

配置代码

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
	<!-- 解决表单提交乱码 -->
	<constant name="struts.i18n.encoding" value="GBK"></constant>
	<!-- 配置Action访问后缀 -->
	<constant name="struts.action.extension" value="do"></constant>
	<!-- 打开开发者模式
			1.重新加载i18n配置
			2.重新加载struts.xml配置
			3.提供更多的错误提示.
	 -->
	<constant name="struts.devMode" value="false"></constant>
	<!-- 
		http://localhost:8080/struts2-mini/HelloAction.action
		http://localhost:8080/struts2-mini/aaa/HelloAction.action
		
		name:单纯的给包起一个名字,不要与其他包名重复
		namespace: 为action访问加上一层或多层路径
		extends: 继承一个其他包,目的是引入其他包的配置
		abstract: 声明包是抽象的.意思就是让别的包来继承,声明为抽象的包中不能含有Action配置
	 -->
	<package name="hello" namespace="/aaa" extends="struts-default" abstract="true/false" >
		<!-- 
			name: 为我们的action类加上一个标识,在访问时填入name名称.就可以找到action
			class: action完整类名
			method:处理的方法
		 -->
		<action name="HelloAction" class="cn.itcast.action.HelloAction" method="execute" >
			<!-- name:返回结果的标识,用于找到结果路径
				 type: 可以决定跳转到结果的方式=> 转发,重定向.....
			 -->
			<result name="success" type="dispatcher" >/index.jsp</result>
		</action>
	</package>
	
 	
 	<!-- 包含:将外部的配置文件引入到主配置文件中  -->
 	<include file="struts-constant.xml"></include>
 	<include file="struts-dynamic.xml"></include>
 	<include file="struts-namespace.xml"></include>
 	<include file="struts-action.xml"></include>
 	<include file="struts-servlet.xml"></include>
</struts>


web.xml配置过滤器

  <!-- 重要: 配置struts2的核心过滤器 -->
  <!-- 注意: 配置struts2过滤器要放置到其他过滤器后面.保证其他过滤器可以执行 -->
  <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>


 

执行流程


 

基本配置


配置文件介绍

1.default.properties :用于配置struts 常量。例如:编码

2.struts-default.xml :struts提供的默认核心配置文件,struts大部分功能都在此配置文件中

3.struts-plugin.xml : struts插件核心配置文件,struts整合其他框架或工具

 

*以上三个文件,用户自己不进行修改

 

4.struts.xml :用户自定义核心配置文件,可以配置所有内同包括常量

5.struts.properties : 用于自定义struts常量配置文件。一般不使用

6.web.xml :也可以配置struts常量(通过初始化参数)一般不用

注意:如果配置常量,所有的配置文件存在优先级,编号越大优先级越高。

 

常见常量

 

1.用于配置项目编码

struts.i18n.encoding=UTF-8

2.struts整合spring需要配置,默认注释掉了

struts.objectFactory = spring

3.struts默认使用文件上传解析工具:apache-commons-fileupload

struts.multipart.parser=jakarta

       3.1临时文件保存位置

       struts.multipart.saveDir=

       3.2上传文件最大大小,默认值:2M,单位字节

       struts.multipart.maxSize

4.用于设置action请求路径扩展名。默认:action或空。多个值使用逗号分隔

struts.action.extension=action,,

       例如:/hello/userAction  或  /hello/userAction.action

5.确定是否使用动态方法调用。默认关闭的。

struts.enable.DynamicMethodInvocation =false

6. 设置开发模式,默认关闭。如果设置true:将提供更多提示信息,自动加载文件。

struts.devMode = false

       6.1自动重新加载国际化资源文件。

       struts.i18n.reload= true

       6.2自动冲洗加载xml配置文件。例如:struts.xml。但不会自动加载action类。

       struts.configuration.xml.reload= true

7. 设置struts标签主题,默认值:xhtml。取值:simple。

struts.ui.theme=xhtml

       开发中常用simple。xhtml存在默认布局,开发中布局使用美工提供页面,布局自定义。

 

struts.xml详解

 

1.<constant> 用于配置struts常量的

       name:struts提供固定常量名称。此名称从 default.properties文件获得

       value:常量值

       例如:<constantname="struts.devMode" value="true"></constant>

2.<package> struts用于管理所有action类

       name:给当前包进行唯一命名,必填项。用于其他包继承的。

              例如:struts-default.xml/<packagename="struts-default" abstract="true">

                     将struts已经完成的功能,作为一个包存在。名称是固定值struts-default。

       namespace:action访问路径前缀。

              例如:"/"

                     "/hello"

                     "/a/b/c"

                     ""

       extends:用于继承其他包的。

              例如:<packageextends="struts-default"> 当前action继承struts已经完成功能。

       abstract:是否抽象,如果设置为true,表示没有具体action实现功能。(了解)

2.1 <action> 用于配置action类(请求处理类)

       name:action名称,用于在请求路径进行访问

       class:action类全限定类名

       method:用于确定action类中需要执行的方法,默认值:execute

2.2 <result> 用于配置结果集

       name:用于确定action类中,方法的返回值

       text:标签体用于设置jsp路径

       type:结果集类型

              dispatcher:请求转发,从一个action到jsp页面,默认值。

              redirect:重定向到jsp页面

              redirectAction:重定向到另一个action

              stream:以流的方法发送浏览器,用于文件下载。

              chain:链,在一次请求中,从一个action到另一个action

2.3 <result-types> 用于配置结果集类型的,一般不用,但需要看的懂。

2.4 <interceptors> 用于配置拦截器

       <interceptor>用于注册拦截器的

       <interceptor-stack>拦截器栈,将已经注册的拦截器组合在一起,形成一个栈。

              例如:<interceptor-stackname="defaultStack"> 声明一个拦截器栈,名称是:defaultStack

2.5 <default-interceptor-ref>用于确定当前默认拦截器的

       例如:<default-interceptor-refname="defaultStack"/> 将“defaultStack”拦截器栈,声明默认拦截器栈

2.6 <default-action-ref> 如果访问的action不存在,默认执行的aciton。

       例如:/a/b/c/d/oneAction 此aciton没有配置,默认情况返回action找不到

              如果配置<default-action-ref> 如果存在404时,不显示action找不到,而是指定action

2.7 <default-class-ref > 用于配置 默认action实现类

       例如:<default-class-refclass="com.opensymphony.xwork2.ActionSupport" />

              如果编写配置文件时没有声明class属性,及<action name="">将执行ActionSupport类。

3 <include> 将多个struts配置文件组合成一个。

       struts.xml入口配置文件,大家共用的。用于存放通用模块。

              <includefile="struts-user.xml" />

              <includefile="struts-book.xml" />

       提供子配置文件

              struts-user.xml

              struts-book.xml

 

 

action访问

 

路径编写

 

http://localhost:8080/struts_day01/primer/a/b/c/Demo02Action

将从struts.xml 获得action,首先将匹配 package.namespace =/primer/a/b/c

如果没有匹配上,向上查询,package.namespace= /primer/a/b

如果没有匹配上,向上查询,package.namespace= /primer/a

如果没有匹配上,向上查询,package.namespace= /primer

如果没有匹配上,向上查询,package.namespace= /  【】

              <packagenamespace="/">

如果没有匹配上,向上查询,package.namespace=

 

方法调用

 

第一种:"!"叹号+方法 (动态方法调用)

注意:默认情况动态方法调用关闭的,必须通过struts常量进行配置

<constantname="struts.enable.DynamicMethodInvocation"value="true"></constant>

格式: action名称!方法名称.action

例如:bookAction!add.action

<ahref="${pageContext.request.contextPath}/bookAction!add.action">动态方法调用--add</a>

第二种:通配符

<action name="userAction">, action.name可以使用通配符星号(*),在action.class、aciton.method、result.name 处可以使用{n}方式匹配星号。

例如:

案例1:userAction_*          将可以通过{1}方法获得第一个星号匹配到内容。

       请求路径 /userAction_add , <action  method="{1}">  {1} 匹配的内容是add,将执行add方法

案例2:userAction_*_*       {1} 匹配ID一个星;{2}匹配第二星

       请求路径 /userAction_add_success   <action name="userAction_*_*"method="{1}"><resutl name="{2}">

       {1}匹配add方法,{2}匹配返回值的名称success

例:3:*_*_* 将采用多个分别描述不同的内容,一次{1}{2}{3}获得

       请求路径 /UserAction_add_success

       <actionname="*_*_*" class="cn.itcast.action.{1}" method="{2}">

       <resultname="{3}">/pages/{3}.jsp

 

Action类

 

实现方式:3种


1. POJO,普通类。

2. 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;

 

success :表示成功了。

none:没有返回值。相当方法void。没有返回值表示没有result,常用与ajax操作。使用response发送数据。

error:服务器异常。

input:表示用户输入错误。

login:表示需要权限。

 

3.ActionSupport类,继承类


支持功能:数据校验,错误提示、国际化等,常用。

 

方法

  public String execute() throws Exception;

1必须是public

2建议又返回值,类型必须String

3方法名称自定义

4没有参数

5需要throw Exception

6非静态的

注意:可以没有返回值,一般情况都有,可以使用return "none" 表示没有返回。

       publicvoid add() throw Exception{

    }

 

 

Struts.xml中struts-default包中的默认配置

如果不手动配置Action  默认Action如下配置:表示如果没有配置class属性,将执行那个action

<default-class-refclass="com.opensymphony.xwork2.ActionSupport" />

action.method : 默认值,execute

在ActionSupport提供的execute方法,返回值success

result.name : 默认值,success


如果不配置结果的type属性,默认type属性如下配置:表示type默认转发 dispatcher

<result-type name="dispatcher"class="org.apache.struts2.dispatcher.ServletDispatcherResult"default="true"/>

 

访问Servlet api

 

1完全解耦,但只能操作作用域

 

不使用曾经学习过的servlet知识,可以去操作三个作用域

ActionContext 工具类,action上下文对象

       获得实例:ActionContext   ac=ActionContext.getContext();

       api:

       ac.put(key,value), 相当于操作request作用域。request.setAttribute("key",value)

       ac.getSession().put(key,value),相当于操作session作用域。session.setAttribute("key",value)

       ac.getApplication().put(key,value),相当于操作application作用域。servletContext.setAtt...

ac.getParameters(),返回参数Map

 

2操作servlet对象

 

ServletActionContext 工具类,获得需要servlet对象

//1 获得request对象
HttpServletRequest request =ServletActionContext.getRequest();
//2 获得response对象
HttpServletResponse response =ServletActionContext.getResponse();
//3获得servletContext对象
ServletContext servletContext =ServletActionContext.getServletContext();
//4 获得session
HttpSession session = request.getSession();

 

3通过实现接口,struts注入

实现原理:Struts2的拦截器。servletConfig做的

 

需要实现指定的接口,此接口都提供setter,struts在执行action方法之前,将调用setter方法进行赋值。

       ServletRequestAware获得HttpServletRequest对象

       ServletResponseAware  获得HttpServletResponse对象

       ServletContextAware获得ServletContext对象

代码示例

 

public class Demo5Action3 extends ActionSupport implements 
ServletRequestAware , ServletResponseAware ,ServletContextAware{
	
	
	private HttpServletRequest request;
	private HttpServletResponse response;
	private ServletContext servletContext;
	private HttpSession session;
	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.session = request.getSession();
		this.request = request;
	}
	@Override
	public void setServletResponse(HttpServletResponse response) {
		this.response = response;
	}
	@Override
	public void setServletContext(ServletContext context) {
		this.servletContext = context;
	}

结果集类型Result(结果视图)


type 的取值:从 struts-default.xml

dispatcher : 默认值,请求转发。一般请求转到jsp页面。

redirect:重定向,一般指重定向到jsp页面。

redirectAction:重定向到action。不能共享request作用的数据。

stream : 下载时使用。

chain :链,从一个aciton,可以到另一个action,且能共享request作用域的数据。


代码示例

<!-- 案例  :结果集类型,重定向jsp -->
		<action name="demo6Action" class="cn.itcast.f_demo.Demo6Action">
			<result type="redirect">/f_demo/type.jsp</result>
		</action>
		<!-- 案例 6.2 :结果集类型,重定向action -->
		<action name="demo6Action2" class="cn.itcast.f_demo.Demo6Action2">
			<result type="redirectAction">demo6Action3</result>
		</action>
		<action name="demo6Action3" class="cn.itcast.f_demo.Demo6Action3">
			<!-- 请求转发 ,默认值-->
			<result type="dispatcher">/f_demo/type.jsp</result>
		</action>




结果集参数设置


能注入哪些参数:找结果类型对应类的源码中的setter方法即可


	<package name="p2" extends="struts-default" namespace="/p2">
		<action name="demo4">
			<result name="success" type="dispatcher">
				<!-- param设置参数:调用dispatcher对应的类的setLocation("/success.jsp") -->
				<param name="location">/success.jsp</param>
			</result>
		</action>
	</package>
标签体内直接写路径是上述代码的简写形式


应用:

转发的目标动作不在同一个包下,而且包有着不同的namespace


代码

	<package name="p1" extends="struts-default">
		<action name="demo3" class="com.itheima.action.Demo3Action">
			<!-- 一个动作转向另外一个动作 -->
			<result name="success" type="chain">
				<param name="namespace">/p2</param>
				<param name="actionName">demo4</param>
			</result>
		</action>


结果视图:局部和全局逻辑视图



局部逻辑视图:只服务于当前的动作


全局逻辑视图:服务于所有的动作


更好的利用package的继承性组织全局视图:



自定义结果类型:CAPTCHA图像




所有的结果类型都是直接或间接的实现了Result接口


自定义结果类型的开发步骤
a、直接或间接实现Result接口
//输出随机验证码图片
//原来怎么输出现在也怎么输出
public class CaptchaResult extends StrutsResultSupport {
	private int width = 120;
	private int height = 20;
	
	public void setWidth(int width) {
		this.width = width;
	}

	public void setHeight(int height) {
		this.height = height;
	}

	protected void doExecute(String finalLocation, ActionInvocation invocation)
			throws Exception {
		ValidateCode code = new ValidateCode(width, height, 4, 9);
		HttpServletResponse response = ServletActionContext.getResponse();
		code.write(response.getOutputStream());
	}

}



b、在struts.xml中声明你的结果类型
	<package name="default" extends="struts-default" abstract="true">
		<result-types>
			<result-type name="captcha" class="com.itheima.results.CaptchaResult"></result-type>
		</result-types>
		<global-results>
			<!-- 全局逻辑视图:所有动作没有name=success的局部视图,到全局视图找-->
			<result name="success">/success.jsp</result>
			<result name="error">/error.jsp</result>
		</global-results>
	</package>

c、在动作中使用自定义的结果类型

	<package name="p1" extends="default">
		<action name="captcha">
			<result name="success" type="captcha">
				<param name="width">120</param>
				<param name="height">25</param>
			</result>
		</action>
		<action name="action1"></action>
	</package>
	<package name="p2" extends="default">
		<action name="action2"></action>
	</package>




Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值