这是对于框架的简单的学习笔记。
需要的包
核心包 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表达式在前端中对数据进行接收。