Struts基础

Struts简介及用处

Struts是MVC一种控制器,替代Servlet
Struts功能:
1.接收用户请求
2.封装请求参数
3.自动数据绑定:会把Action中的属性自动传到页面
4.调用Model对请求进行处理
5.简化web开发
6.对请求进行响应:
7.获取session,appliction
页面跳转:
转发  重定向
chain:转发到Struts的某个方法
redirectAction:重定向到Struts的某个方法

执行流程:

Struts中的控制器分为:
1.核心控制器:只需要配置
就是一个Filter:(在web.xml中配置) StrutsPrepareAndExecuteFilter
/*

<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>
请求首先进入核心控制器,加载Struts组件:
default.properties
struts-default.xml

struts.xml:

配置了url和业务控制器之间的映射关系

<?xml version="1.0" encoding="UTF-8"?>
<!-- 导入struts.dtd文件 
	dtd:xml标签定义文件
-->
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<!-- constant:常量
		配置常量 -->
	<!-- 开启开发者模式  -->
	<constant name="struts.devMode" value="true"></constant>
	<constant name="struts.action.extension" value="action,do,av,"></constant>
	<!-- 修改文件上传最大长度 -->
	<constant name="struts.multipart.maxSize" value="99999999999"></constant>
	
	<package name="myinterceptors" extends="struts-default">
		<interceptors>
			<!-- 声明拦截器 -->
			<interceptor name="sexenerger" class="myinterceptors.SexEnegerInterceptor"></interceptor>
			<!-- 声明拦截器栈  -->
			<interceptor-stack name="mystack">
				<!-- 一个拦截器可以引用别的拦截器栈  -->
				<!-- 注意:自定义的拦截器栈首先引入defaultStack:
					继承Struts功能
				 -->
				<interceptor-ref name="defaultStack"></interceptor-ref>
				<interceptor-ref name="sexenerger"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		<!-- 通过配置默认拦截器栈来使用 -->
		<default-interceptor-ref name="mystack"></default-interceptor-ref>
	</package>
	
	<package name="loginInterceptor" extends="struts-default">
		<interceptors>
			<!-- 声明拦截器 -->
			<interceptor name="loginLJ" 
				class="myinterceptors.LoginInterceptor">
				<!-- excludeMethods:放行的请求
					多个请求之间使用, 
					excludeMethods:放行的方法名
					-->
				<param name="excludeMethods">multiEXE,tologin,toregist,login,regist</param>	
			</interceptor>
			<!-- 声明拦截器栈 -->
			<interceptor-stack name="mystack2">
				<interceptor-ref name="defaultStack"></interceptor-ref>
				<interceptor-ref name="loginLJ"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		<!-- 指定默认拦截器  -->
		<default-interceptor-ref name="mystack2"></default-interceptor-ref>
		<!-- 配置全局视图 -->
		<global-results>
			<result name="login">/WEB-INF/login.jsp</result>
		</global-results>
	</package>
    <!-- 配置了url和业务控制器之间的映射关系
		一个struts.xml中可以有多个package
		一个package就是一个逻辑分组
		注意package的name值不能重复
		一个package可以extends(扩展)别的package
		一般情况,extends="struts-default"
		namespace="/请求路径":配置什么样的请求可以进入该package
		/:所有请求 
		/abc:/应用名/abc下的子请求
		/abc/avList.av
	 -->
	<package name="up" namespace="/user" extends="loginInterceptor">
	    <!-- action name:子请求路径  -->
		<action name="to*" class="myaction.UserAction"
			method="to{1}">
			<!-- result name:Action方法的返回值:
				默认使用转发 
				通过设置type属性值,设置跳转方式
			 -->
			<result>/WEB-INF/{1}.jsp</result>	
		</action>
		<action name="regist" class="myaction.UserAction"
			method="regist">
			<!-- <interceptor-ref name="mystack"></interceptor-ref> -->
			<result name="success">/WEB-INF/login.jsp</result>	
			<result name="error">/WEB-INF/regist.jsp</result>	
		</action>	
		<action name="login" class="myaction.UserAction"
			method="login">
			<result name="success" type="redirectAction">
				<param name="namespace">/user</param>
				<param name="actionName">tohelloNiTuo</param>
			</result>	
		</action>
	</package>
	
</struts>
2.业务控制器:
专门处理用户请求的一个Java类,它就是一个普通的Java类
Struts建议继承ActionSupport

执行流程:
---->核心控制器----->
加载struts组件:
default.properties
struts-default.xml
struts.xml(Struts主配置文件)
--->业务控制器
Struts与Servlet API解耦的访问方式
注意:这种方式获取返回值为Map,只能进行put值和取值

第一步:提供了三个Map对象访问request、session、application作用域
第二步通过ActionContext获取三个Map对象
          Object get("request")
          Map getSession()
          Map getApplication()
struts2耦合的访问 Servlet API的方式
通过ServletActionContext 可以直接访问session applicaton,request作用域
HttpSession session =
                ServletActionContext.getRequest().getSession();
使用Struts取Session、application中的数据要指定Scope
${sessionScope}
${applicationScope}

Struts开发步骤

1.添加jar包,struts-blank lib下的所有jar
2.在web.xml中配置Struts核心控制器:
StrutsPrepareAndExecuteFilter
3.在src根目录创建struts.xml(Struts的主配置文件):
配置了url和业务控制器之间的映射关系
4.编写业务控制器:就是一个Java类
XXXAction
处理的请求的方法:
1.public 
2.无参
3.返回值只能是String

struts拦截器

struts-default.xml中配置了很多struts拦截器
interceptor 
例如:
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
一个拦截器对应一个功能,struts靠组合拦截器实现了各种复杂功能
拦截器组合:拦截器栈

一般情况,自定义的package
都extends="struts-default":
继承struts拦截器,继承了struts的功能
注意:
package的extends可以传递

struts的url:
package namespace+action的name

Struts的核心功能全部靠拦截器实现:
一个功能对应一个拦截器
拦截器:拦截请求,在进入Action之前拦截,return之后再拦截
自定义拦截器:
在进入某个Action之前或Action执行之后需要添加功能,以此扩展struts的功能
1.1继承AbstractInterceptor:默认全拦截
重写interceptor方法
1.2在struts.xml中配置拦截器
注意:一旦配了自定义拦截器,默认拦截器失效
2.继承MethodFilterInterceptor
MethodFilterInterceptor是AbstractInterceptor子类
它可以指定拦截哪些方法:includeMethods
还可以指定不拦截哪些方法:excludeMethods
多个方法中间用,分隔

异常原因

No result defined for struts.xml action myaction.ActionDemo and result av
struts.xml action标签中 未找到业务控制器返回值对应的result标签

业务控制器方法返回值和页面名之间的映射:
在struts.xml action标签中添加result标签
Struts如何向页面传值
在Action中
把要传的数据添加为Action的属性
并且必须有get方法
数据的作用域相当于request
Struts跳转技术
result标签 type属性值:
1.dispatcher:默认转发页面
2.redirect:重定向页面
3.chain:转发到Action
4.redirectAction:重定向到Action
5.stream:用于文件上传
ValueStack:值栈
一个Action对象对应一个ValueStack,
ValueStack中存储Action对象中的数据
Action的生命周期:
一次请求:
生:Struts核心控制器接收到请求后,通过加载struts.xml文件
确定需要实例化的Action对象
活:请求处理期间
死:请求处理完毕
Action如何接收请求参数:
1.有几个请求参数就在Action中添加几个属性,并提供set/get方法

2.按请求参数名封装出一个Java类
  在Action使用该类的对象做属性
  注意:
  1.页面的name="Action中的对象名.请求参数名"
  2.Struts会在接收请求时自动创建该对象

3.Action 实现 ModelDriven<T>接口
按请求参数名封装出一个Java类
在Action使用该类的对象做属性
注意:
1.页面name属性值无需改动
2.Action中必须手动new出该对象
3.getModel(){
	return 对象名;
}

总结:
使用Struts会自动进行类型转化
类的属性名一定要和请求参数名一致

chain:
<param name="namespace">要跳转Action的namespace</param>
<param name="actionName">要跳转Action的ActionName</param>

redirectAction:
<param name="namespace">要跳转Action的namespace</param>
<param name="actionName">要跳转Action的ActionName</param>
注意:
使用的是动态方法调用:
通过actionName定位到相应的方法

<action name="*" method="{1}">
	<result name="{1}">{1}.jsp</result>
</action>
*:通配符,表示任意字符
{n}:第几个*对应的字符  n从1开头


继承ActionSupport的好处:
1.有默认调用的方法:
action标签可以不指定调用方法
默认调用execute方法:
返回值:SUCCESS 
result标签的name属性默认值为"success"

2.封装了很多功能

Struts执行流程:

1.请求进入Struts核心控制器,StrutsPreparedAndExcecuteFilter
2.加载Struts组件:
default.properties   struts-default.xml
3.加载struts.xml:
url和Action之间的映射,确定请求去哪个Action的哪个方法进行处理
4.通过Action的方法的返回值查询对应的result
5.根据result的type确定以何种方法进行跳转
6.展示视图

注意:多个package可以使用一个业务控制器(Action)
package就是一个逻辑分组

Struts ajax:

1.添加jackson.jar和struts-json-plugin.jar
2.struts.xml 中 package extends="json-default"
3.在Action类中添加map对象做属性
4.Action类中使用ObjectMapper
  把map序列化为JSONString
5.  <result type="json">
		<param name="root">map的名字</param>
	</result>

OGNL:
Object Graphic Navigation Language:
对象导航语言
通过Struts标签在页面取值,进行逻辑判断

值栈ValueStack:一个Action拥有一个值栈
存放Action中的所有数据,包括Action对象本身
ValueStack中有一个root对象:
通过根对象可以查询别的对象
值栈数据的作用域:一次请求

OGNL何时加#:
直接取值不加#
取内部值时需加#
取session #session.key ${sessionScope.key}
取application #application.key 
${applicationScope.key}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值