震惊!Struts2的大概学习

这是对于框架的简单的学习笔记。

需要的包

核心包 struts2-core

web.xml中配置过滤器
<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
        <filter-name>struts2</filter-name>
         <url-pattern>*.do</url-pattern> <!--过滤条件 -->
</filter-mapping>

Struts核心配置文件 Struts.xml

简单的配置信息

struts配置文件中常用的标签
constant标签

constant标签一般是用来配置常量的,name属性是常量名,value是常量值,constant配置的常量可以改变struts2的一些行为,比如UI标签的样式,编码格式等等。

<constant name="struts.action.extension" value="do,html"/> <!-- 请求后缀是do或者html -->
<constant name="struts.i18n.encoding" value="utf-8"/> <!-- 设置编码解决乱码问题 -->
<constant name="struts.ui.theme " value="simple"/> <!-- 设置主题 --> 
<constant name="struts.enable.DynamicMethodInvocation" value="true"/> <!-- 允许动态调用 -->
package标签
<package name="default" namespace="/" extends="struts-default ">

package是业务模块划分的包,可以吧不同的业务放在不同的package中例如商品,用户等。

其中name属性是包的名字,用来区分不同的package和标明所属的业务,例如user这种命名。

namespace是命名空间,/代表的是根目录,他的作用相当于SpringMVC中controller类中@RequestMapping注解的作用,是一个同一包业务的统一请求父路径。如:

<package name="user" namespace="/user" extends="struts-default ">
	<action name = "login" class="action.LoginAction">

这个具体action的方法的请求路径就是/user/login.action,action是默认的请求后缀,可以通过constant标签进行修改。

extends属性是继承,通常都会继承struts-default。在struts-default中定义了大量的struts特性,如拦截器和参数处理的功能,如果不继承,可能会遇到参数无法绑定或找不到action类。

action标签
<action name="login" class="action.LoginAction">
 <!--success是Action类中返回的字符串,根据不同字符串返回不同的页面-->
	<result name="success">index.jsp</result>
	<result name="error">error.jsp</result> 
	<result name="input">login.jsp</result>
 </action>

action标签用来处理请求和响应结果。
name属性是请求的名字,此处不需要加.action。同一个package下的action不能重名。
class属性指定处理该请求的类,是类的全路径。默认的处理请求时会去类中找名为execute的方法。如果
不指定class,将默认ActionSupport为处理请求的类。
result标签用来处理请求结果,name属性是Action类中返回的字符串。标签的值是要跳转的页面地址。默认从package的命名空间的位置开始找
name如果不写的话,默认是success。

result标签

result标签是action标签下的子标签,用于返回数据和指定返回对象
,一般分为四种:dispatcher、redirect、redirectAction、chain

1.dispatcher
result的默认类型,效果和servlet中的请求转发效果一样,也就是类似于
request.getRequestDispatcher(“success.jsp”).forward(request,response);
请求转发的意思是当前请求的参数,属性在下一个页面或请求中仍然可以使用。网页地址不变
举例
不写type属性时默认也是dispatcher类型。

<result name="success" type="dispatcher" >index.jsp</result>

2.redirect
效果和servlet的重定向差不多,但是这个重定向只能够重定向到网页。也就是相当于response.sendRedirect(“success.jsp”);重定向是不包含当前请求中的参数的。网页地址是重新转发的地址

<result name="success" type="redirect" >index.jsp</result>

3.redirectAction
也是重定向,不过是重定向到指定的业务类中,也就是action
当重定向的action在同一个package下时

<action name="reg" class="action.UserAction" method="regist">
<result name="success" type="redirectAction">login.action</result> 
<result name="error">regist.jsp</result> 
</action>

当重定向的action在不同的package下时

<action name="login" class="action.UserAction" method="login">
<result name="success" type="redirectAction"> <!--调用不同package下的action-->
<param name="namespace">/</param>
<param name="actionName">hello.action</param>
<param name="username">123</param>  <!--传递其它参数-->
 </result> 
 </action>

4.chain
当希望重定向到业务类并且还共享数据时redirect就不适用了,可以使用chain

<action name="reg" class="action.UserAction" method="regist">  <!--注意chain的action后面没有后缀-->
<result name="success" type="chain">login</result> 
<result name="error">regist.jsp</result>
 </action>

业务核心Action

实现action有两种方式一种是实现Action接口,另一种方式是继承ActionSupport类。在ActionSupport中提供了一些实现好的业务方法。推荐这种方式

Action中的方法必须返回一个String类型的字符串,这个字符串与struts.xml中result标签的name属性想对应,struts.xml会根据返回的字符串查找对应的页面
Action接口中常用的结果常量:
在这里插入图片描述
实现Action接口,和继承ActionSupport类的区别
实现Action接口每个Action类只有一个业务方法execute方法。继承ActionSupport可以有多个自定义的业务方法
多个自定义方法的调用配置方式
1.通过action标签中的method属性来调用

<action name="login" class="action.UserAction" method="login">
 <result name="success">index.jsp</result><!--登录成功去首页-->
<result name="error">login.jsp</result><!--登录失败回登录页-->
</action>

method=“login” 标识调用类中的login()方法处理请求。如果找不到login()方法会报错。
2.动态调用
减少action标签的数量
首先constant开启动态调用的选项
然后就是请求时直接使用,依旧用login方法举例
请求的语法是 请求名!方法名.action
例如请求login user!login.action调用的就是login方法。
action配置如下

 <global-allowed-methods>login,regist</global-allowed-methods>
 <action name="user" class="action.UserAction"> 
	  <result name="success">/index.jsp</result><!--成功去首页-->
	  <result name="error">/error.jsp</result><!--失败去错误-->
 </action>

3.通配符

<global-allowed-methods>login,regist</global-allowed-methods> 
<action name="*User" class="action.UserAction" method="{1}"> 
	<result name="success">/index.jsp</result> 
	<result name="error">{1}.jsp</result><!--失败了就返回原来的页面-->
</action>

类似于属性method的方法 {1}表示的*的内容
例如请求login方法 :loginUser.action

设置默认的action
当找不到匹配的action时,可以设置一个当所有action都不匹配时使用的默认action,只对当前的package有效

<default-action-ref name="default"/> 
<action name="default">
 <result>error.jsp</result> 
 </action>

动态结果
当我们想给返回的一个字符串,例如“SUCCESS” 在不同情况下返回到不同页面时可以在action类中设置一个私有的字符串来记录返回的页面 private String page; //getter/setter方法略,给page不同的值就跳转到不同的页面result的配置如下

 <action name="login" class="action.UserAction" method="login">  
 <result name="success">${page}.jsp</result> <!--读取action设置的page变量的值 -->
 <result name="error">login.jsp</result>
 </action>

全局结果
当一个字符串对应的页面要多次使用时(在不同的业务分类package中进行登陆,都需要跳转到登陆页面)可以设置一个全局结果

  <global-results>
  <result name="success">index.jsp</result>
  </global-results>

所有使用到login 的action都可以不用在配置success的result,如果配置了,将优先使用action中配置的result。

一些package中的属性设置顺序
result-types? interceptors? default-interceptor-ref? default-action-ref? default-class-ref? global-results? global-exception-mappings? action*
其中?代表出现0次或1次 *代表0次或多次。

ServletAPI

servletAPI就是常用的 request,response,application这些API
我们想要在action中使用这些API有两种方式,耦合和非耦合。

耦合:首先需要导入servlet所需要的包,然后可以直接在action中通过ServletActionContext这个静态类获取对象

HttpServletRequest request = ServletActionContext.getRequest(); 
HttpSession session = request.getSession(); 
HttpServletResponse response = ServletActionContext.getResponse();

非耦合:首先获得ActionContex静态方法getContextt来获得AactionContext对象然后调用对象的方法来获取API对应的map对象通过操作map 的方式来决定返回页面的数据
action操作的代码

public String regist() {
 ActionContext ac = ActionContext.getContext();
  Map request = (Map) ac.get("request");//获取request 
  Map session = ac.getSession();//获取session 
  Map application = ac.getApplication();//获取application session.put("session_user","123");//向session中存值 
  return SUCCESS; 
  }

页面获取数据时${sessionScope.session_user}

struts常用的标签

首先需要导入struts 的标签库
<%@taglib uri= “/struts-tags” prefix= “s” %>
struts相关的表单标签

<s:form action="/user/login.action" method="POST"> 
<s:textfield name="username" label="用户名"/> 
<s:password name="password" label="密码"/> 
<s:submit value="登录"/> </s:form>

和html的表单很像,但是会有默认的格式,也就是换行,如果想取消格式需要在struts.xml配置文件中进行constant的配置来选择主题<constant name="struts.ui.theme " value="simple"/>simple会取消掉换行的格式和html格式一样

struts通用标签

<s:if test=""></s:if>
<s:elseif test=""></s:elseif>
<s:else></s:else>

if判断标签和jstl的判断标签一致,elseif和else是struts的标签需要和if标签一起使用。

<s:iterator value="" var="" status=""></s:iterator>

用于集合的遍历标签,和jstl的foreach同一个作用。
当集合中的元素是基本类型或者是引用类型时格式不一样
基本类型

<!--遍历基本数据类型的集合-->
<s:iterator value="strList" var="str" status="status">
	<!--status属性可以访问对象索引的奇偶 even奇 odd偶-->
	<s:if test="#status.even">
	<tr style="">
		<td><s:property value="str"></td>
	</tr>
	</s:if>
	<s:else>
		<tr><td><s:property value="str"/></td></tr>
	</s:else>
</s:iterator>

基本数据类型因为没有识别数据的名称所以需要有var来确定数据的引用名称

<!--遍历引用数据类型的集合-->
<s:iterator value="users"  status="status">
	<!--status属性可以访问对象索引的奇偶 even奇 odd偶-->
	<s:if test="#status.even">
	<tr style="">
		<td><s:property value="userName"></td>
	</tr>
	</s:if>
	<s:else>
		<tr><td><s:property value="userName"/></td></tr>
	</s:else>
</s:iterator>

引用数据类型可直接通过名称来引用。

数据校验

待更新

struts调用类action和前端的信息传递方式
由表单举例,表单提交的数据的name属性的名称会直接在请求类中进行匹配(需要有get和set方法)有相同的会直接进行赋值,返回数据是同样的道理可以直接通过EL表达式在前端中对数据进行接收。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值