首页 > 代码库 > struts2学习笔记
struts2学习笔记
struts1的名气+webwork核心=struts2
2.在web.xml中添加一个配置filter,拦截所有的请求/*, StrutsPrepareAndExecuteFilter
3.在src下添加一个struts.xml, package-action-result
4.如果要实现控制,需要添加action类
4.1.实现Action接口
4.2.继承ActionSupport类
4.3.直接创建类,但是必须有方法String execute()
5.修改struts.xml中的action标签,添加属性class对应该action类
开发模式:struts.devMode = true/false
默认编码:struts.i18n.encoding = UTF-8(默认)
2.使用javabean:在aciton中添加一个对象,并提供get/set方法
表单元素的名字,应该为对象名.属性名
3.使用ModelDriven
2.在struts.xml中,添加相应的配置:
2.1.第一种:在action标签中添加属性method,指定方法
2.2.第二种:每个模块,单独写一个配置文件,在struts.xml中include进来
2.3.第三种:动态方法:提交时,url后面加上"!方法名",例如"house!add"
2.4.第四种:通配符:
<action name="house_*" class="com.HouseAction" method="{1}">
<action name="index"><result>/index.jsp</result></action>
2.type,默认值是dispatcher,指跳转方式
dispatcher: 转发到jsp
redirect: 重定向到本地或其他jsp或者action
redirectAction: 重定向到本地action
chain: 转发到action
2.在方法中动态给该属性赋值
3.在struts.xml中,该action标签的result的url使用${属性名}
public String login(){
return INPUT;
}
<result name="input">/login.jsp</result>
当提交表单失败的时候,由于result默认type是转发,所以url地址不会变;
下次再提交时,会导致/user重复出现。
解决办法:
1.提交表单的action使用绝对路径,前面加一个request.getContextPath()
2.result中的type改成重定向
设置全局结果和全局异常:
<package name="base" extends="struts-default" namespace="/">
<global-results>
<result name="error">error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.NullPointerException"></exception-mapping>
</global-exception-mappings>
</package>
Map<String,Object> request = (Map<String,Object>)ctx.get("request");
Map<String,Object> session = ctx.getSession();
Map<String,Object> application= ctx.getApplication();
通过实现RequestAware,SessionAware,ApplicationAware接口,也可以获得
2.通过el表达式
3.stuts标签:<s:property value=http://www.mamicode.com/"[#request.key][#attr.key]"/>
获得原生的Servlet API对象的方式一:
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
ServletContext application = ServletActionContext.getServletContext();
获得原生的Servlet API对象的方式二:
通过实现接口ServletRequestAware,ServletContextAware,也可以获得
<c:forEach items="" var=""></c:forEach>
<c:out value=http://www.mamicode.com/"">
<c:set var="" value=http://www.mamicode.com/"">
<c:remove var=""></c:remove>
action中定义的属性
OGNL访问Stack Context(值栈上下文):#作用域.属性名
作用域
OGNL访问List: list[0], list.get(0)
OGNL访问Map: map[‘key‘], map.key,
取出所有key: map.keys
取出所有值: map.values
OGNL访问Set: set.toArray()[0]
OGNL调用静态方法和属性:
@类的完全限定名@静态方法名
@类的完全限定名@静态属性名
struts.xml添加常量配置:
struts.ognl.allowStaticMethodAccess = true
1.struts自带的jar包:
antlr-2.7.6.jar和anltr-2.7.2.jar
2.Hibernate的3个lib
asm.jar
asm-attrs.jar
cglib-2.1.3.jar
commons-collections-2.1.1 和 commons-collections-3.2
commons-logging-1.0.4 和 commons-logging-api-1.1
找到重名的jar包,删掉低版本的
1.<s:property value=http://www.mamicode.com/"OGNL表达式" default="" escapeHTML="" />
2.<s:debug/>
3.<s:date name="OGNL表达式" format="yyyy-MM-dd HH:mm:ss"/>
4.<s:set var="变量名" value=http://www.mamicode.com/"OGNL表达式" scope="作用域,默认是action"/>--- OGNL路径过长,或重复使用某个方法的执行结果
5.<s:url value=http://www.mamicode.com/"地址" var="t"/>有var属性当前字符串不显示
6.<s:a href=http://www.mamicode.com/"字符串">,如果href里面想填入OGNL,则需要把字符串转换成OGNL表达式,%{#t}
7.<s:include value=http://www.mamicode.com/"要包含的jsp"/> 动态的包含
该属性默认是字符串:s:a-href,s:url-value, s:include-value
2.OGNL转换成字符串:
该属性默认是OGNL:--->用引号引起来
s:property-value,
s:property-default,
s:date-name
s:param-value
假如不确定该属性是否默认为OGNL,可以使用%{},来保证作为OGNL表达式处理
控制标签:
1.<s:if test="OGNL表达式"></s:if>
2.<s:else><s:elseif>
3.<s:iterator var="当前元素" value=http://www.mamicode.com/"集合" status="集合状态">
取当前元素的属性:<s:property value=http://www.mamicode.com/"#当前元素.属性名"/>
判断当前索引是否奇数:<s:if test="#集合状态.odd"></s:if>
判断当前索引是否偶数:<s:if test="#集合状态.even"></s:if>
</s:iterator>
使用jQuery实现隔行变色
$(function(){
$("table tr:gt(0):even").css("background","yellow");
});
UI标签:
<s:form theme="主题" action="" method=""></s:form>
<s:textfield name="" value=http://www.mamicode.com/""/>
<s:textarea name="" value=http://www.mamicode.com/""/>
<s:submit/>
<s:select name="" list="OGNL表达式" listKey="作为value的属性" listValue=http://www.mamicode.com/"作为显示文字的属性"/>
<s:doubleselect
name="" list="OGNL表达式1" listKey="作为value的属性" listValue=http://www.mamicode.com/"作为显示文字的属性"
doubleName="" doubleList="OGNL表达式2" doubleListKey="作为value的属性" doubleListValue=http://www.mamicode.com/"作为显示文字的属性"/>>
注:OGNL表达式2应该是根据OGNL表达式1取出的集合,例如map.get(top)
日历控件:<s:datetimepicker name=""/>
引入步骤:1.导入struts-dojo-xxx.jar
2.在jsp上引入该taglib:
<%@taglib uri="/struts-dojo-tags" prefix="sx"%>
3.在head中添加标签,标志要引入相关css和js文件
<sx:head parseContent="true"/>
4.使用该日历控件
intercept(ActionInvocation invocation){
//1.拦截前操作
//2.执行后续
String result = invocation.invoke();
//3.拦截后操作
return result;
}
2.在struts.xml的package中,添加拦截器
<interceptors>
<interceptor name="拦截器1" class="类的全限定名"/>
<interceptor name="拦截器2" class="类的全限定名"/>
<interceptor-stack name="拦截器栈名">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="拦截器1"/>
<interceptor-ref name="拦截器2"/>
</interceptor-stack>
</interceptors>
3.在struts.xml的action中,指定拦截器
<interceptor-ref name="拦截器|拦截器栈"/>
如果还要使用struts默认的拦截器栈,需要再添加:
<interceptor-ref name="defaultStack"/>
表单内容: 学号、姓名、照片
1.表单中添加文件域,同时表单的提交方式应该是post,enctype属性应该是multipart/form-data
2.添加commons-fileupdate**.jar,commons-io**.jar
3.在action中,根据文件域的name,添加三个属性
File xxx;
String xxxContentType;
String xxxFileName;
4.在action方法中,将文件另存
String uploadPath = ServletActionContext.getServletContext().getRealPath("/upload");
FileOutputStream fos = new FileOutputStream(uploadPath+"/"+xxFileName);
FileInputStream fis = new FileInputStream(xxx);
IOUtils.copy(fis, fos);
限制文件上传的大小:
1.设置全局常量
<constant name="struts.multipart.maxSize" value=http://www.mamicode.com/"5000000"/>
2.添加拦截器:限制单个action的文件上传大小
<intercepter-ref name="fileUpload">
<param name="maximumSize">5000000</param>
</intercepter>
<intercepter-ref name="defaultStack"/>
全局常量的默认值是2M,如果要限制文件大小小于2M,两种方式任选其一;
如果要限制文件大小大于2M,则全部常量必须设置为大于或等于目标大小,拦截器可选。
限制文件上传的类型:
给fileUpload拦截器添加参数:
<intercepter-ref name="fileUpload">
<param name="allowedTypes">image/jpeg,image/pjpeg,image/png,image/gif</param>
</intercepter>
<intercepter-ref name="defaultStack"/>
如果出现错误:HTTP Status 404 - No result defined for action com.pb.web.action.UploadAction and result input
则是表示当result是input时,没有在action中定义对应的result。
file文件域,只能取value,不能给value赋值
使用struts2的步骤:
1.导入jar文件2.在web.xml中添加一个配置filter,拦截所有的请求/*, StrutsPrepareAndExecuteFilter
3.在src下添加一个struts.xml, package-action-result
4.如果要实现控制,需要添加action类
4.1.实现Action接口
4.2.继承ActionSupport类
4.3.直接创建类,但是必须有方法String execute()
5.修改struts.xml中的action标签,添加属性class对应该action类
struts.xml中定义常量
<constant name="" value=http://www.mamicode.com/""/>开发模式:struts.devMode = true/false
默认编码:struts.i18n.encoding = UTF-8(默认)
如何绑定表单元素的值:
1.使用属性:在action中添加一个同名属性,并提供get/set方法2.使用javabean:在aciton中添加一个对象,并提供get/set方法
表单元素的名字,应该为对象名.属性名
3.使用ModelDriven
如何在一个Action类中处理多个请求
1.在该Action类中,每个请求填加一个方法2.在struts.xml中,添加相应的配置:
2.1.第一种:在action标签中添加属性method,指定方法
2.2.第二种:每个模块,单独写一个配置文件,在struts.xml中include进来
2.3.第三种:动态方法:提交时,url后面加上"!方法名",例如"house!add"
2.4.第四种:通配符:
<action name="house_*" class="com.HouseAction" method="{1}">
默认action:
<default-action-ref name="index"/><action name="index"><result>/index.jsp</result></action>
<result>的属性:
1.name,默认值是success。对应方法执行的返回结果2.type,默认值是dispatcher,指跳转方式
dispatcher: 转发到jsp
redirect: 重定向到本地或其他jsp或者action
redirectAction: 重定向到本地action
chain: 转发到action
动态结果:
1.在action中添加一个String属性,记录目标url2.在方法中动态给该属性赋值
3.在struts.xml中,该action标签的result的url使用${属性名}
问题:url重复的问题
<form action="user/login">public String login(){
return INPUT;
}
<result name="input">/login.jsp</result>
当提交表单失败的时候,由于result默认type是转发,所以url地址不会变;
下次再提交时,会导致/user重复出现。
解决办法:
1.提交表单的action使用绝对路径,前面加一个request.getContextPath()
2.result中的type改成重定向
设置全局结果和全局异常:
<package name="base" extends="struts-default" namespace="/">
<global-results>
<result name="error">error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.NullPointerException"></exception-mapping>
</global-exception-mappings>
</package>
如何获得struts2封装的请求,会话,应用
ActionContext ctx = ActionContext.getContext();Map<String,Object> request = (Map<String,Object>)ctx.get("request");
Map<String,Object> session = ctx.getSession();
Map<String,Object> application= ctx.getApplication();
通过实现RequestAware,SessionAware,ApplicationAware接口,也可以获得
如何在JSP中获取请求,会话,应用中的值:
1.通过jsp内置对象2.通过el表达式
3.stuts标签:<s:property value=http://www.mamicode.com/"[#request.key][#attr.key]"/>
获得原生的Servlet API对象的方式一:
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
ServletContext application = ServletActionContext.getServletContext();
获得原生的Servlet API对象的方式二:
通过实现接口ServletRequestAware,ServletContextAware,也可以获得
JSTL:
<c:if test=""></c:if><c:forEach items="" var=""></c:forEach>
<c:out value=http://www.mamicode.com/"">
<c:set var="" value=http://www.mamicode.com/"">
<c:remove var=""></c:remove>
OGNL知识点
OGNL访问Value Stack(值栈):对象名.属性名action中定义的属性
OGNL访问Stack Context(值栈上下文):#作用域.属性名
作用域
OGNL访问List: list[0], list.get(0)
OGNL访问Map: map[‘key‘], map.key,
取出所有key: map.keys
取出所有值: map.values
OGNL访问Set: set.toArray()[0]
OGNL调用静态方法和属性:
@类的完全限定名@静态方法名
@类的完全限定名@静态属性名
struts.xml添加常量配置:
struts.ognl.allowStaticMethodAccess = true
1.struts自带的jar包:
antlr-2.7.6.jar和anltr-2.7.2.jar
2.Hibernate的3个lib
asm.jar
asm-attrs.jar
cglib-2.1.3.jar
commons-collections-2.1.1 和 commons-collections-3.2
commons-logging-1.0.4 和 commons-logging-api-1.1
找到重名的jar包,删掉低版本的
Struts2标签:
数据标签:1.<s:property value=http://www.mamicode.com/"OGNL表达式" default="" escapeHTML="" />
2.<s:debug/>
3.<s:date name="OGNL表达式" format="yyyy-MM-dd HH:mm:ss"/>
4.<s:set var="变量名" value=http://www.mamicode.com/"OGNL表达式" scope="作用域,默认是action"/>--- OGNL路径过长,或重复使用某个方法的执行结果
5.<s:url value=http://www.mamicode.com/"地址" var="t"/>有var属性当前字符串不显示
6.<s:a href=http://www.mamicode.com/"字符串">,如果href里面想填入OGNL,则需要把字符串转换成OGNL表达式,%{#t}
7.<s:include value=http://www.mamicode.com/"要包含的jsp"/> 动态的包含
需要进行转换的:
1.字符串转换成OGNL:-->%{}该属性默认是字符串:s:a-href,s:url-value, s:include-value
2.OGNL转换成字符串:
该属性默认是OGNL:--->用引号引起来
s:property-value,
s:property-default,
s:date-name
s:param-value
假如不确定该属性是否默认为OGNL,可以使用%{},来保证作为OGNL表达式处理
控制标签:
1.<s:if test="OGNL表达式"></s:if>
2.<s:else><s:elseif>
3.<s:iterator var="当前元素" value=http://www.mamicode.com/"集合" status="集合状态">
取当前元素的属性:<s:property value=http://www.mamicode.com/"#当前元素.属性名"/>
判断当前索引是否奇数:<s:if test="#集合状态.odd"></s:if>
判断当前索引是否偶数:<s:if test="#集合状态.even"></s:if>
</s:iterator>
使用jQuery实现隔行变色
$(function(){
$("table tr:gt(0):even").css("background","yellow");
});
UI标签:
<s:form theme="主题" action="" method=""></s:form>
<s:textfield name="" value=http://www.mamicode.com/""/>
<s:textarea name="" value=http://www.mamicode.com/""/>
<s:submit/>
<s:select name="" list="OGNL表达式" listKey="作为value的属性" listValue=http://www.mamicode.com/"作为显示文字的属性"/>
<s:doubleselect
name="" list="OGNL表达式1" listKey="作为value的属性" listValue=http://www.mamicode.com/"作为显示文字的属性"
doubleName="" doubleList="OGNL表达式2" doubleListKey="作为value的属性" doubleListValue=http://www.mamicode.com/"作为显示文字的属性"/>>
注:OGNL表达式2应该是根据OGNL表达式1取出的集合,例如map.get(top)
日历控件:<s:datetimepicker name=""/>
引入步骤:1.导入struts-dojo-xxx.jar
2.在jsp上引入该taglib:
<%@taglib uri="/struts-dojo-tags" prefix="sx"%>
3.在head中添加标签,标志要引入相关css和js文件
<sx:head parseContent="true"/>
4.使用该日历控件
使用拦截器
使用拦截器的步骤1.新增一个拦截器类,继承AbstractInterceptor,在实现intercept()方法,进行拦截前后的操作。intercept(ActionInvocation invocation){
//1.拦截前操作
//2.执行后续
String result = invocation.invoke();
//3.拦截后操作
return result;
}
2.在struts.xml的package中,添加拦截器
<interceptors>
<interceptor name="拦截器1" class="类的全限定名"/>
<interceptor name="拦截器2" class="类的全限定名"/>
<interceptor-stack name="拦截器栈名">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="拦截器1"/>
<interceptor-ref name="拦截器2"/>
</interceptor-stack>
</interceptors>
3.在struts.xml的action中,指定拦截器
<interceptor-ref name="拦截器|拦截器栈"/>
如果还要使用struts默认的拦截器栈,需要再添加:
<interceptor-ref name="defaultStack"/>
表单内容: 学号、姓名、照片
Struts实现文件上传:
单个文件:1.表单中添加文件域,同时表单的提交方式应该是post,enctype属性应该是multipart/form-data
2.添加commons-fileupdate**.jar,commons-io**.jar
3.在action中,根据文件域的name,添加三个属性
File xxx;
String xxxContentType;
String xxxFileName;
4.在action方法中,将文件另存
String uploadPath = ServletActionContext.getServletContext().getRealPath("/upload");
FileOutputStream fos = new FileOutputStream(uploadPath+"/"+xxFileName);
FileInputStream fis = new FileInputStream(xxx);
IOUtils.copy(fis, fos);
限制文件上传的大小:
1.设置全局常量
<constant name="struts.multipart.maxSize" value=http://www.mamicode.com/"5000000"/>
2.添加拦截器:限制单个action的文件上传大小
<intercepter-ref name="fileUpload">
<param name="maximumSize">5000000</param>
</intercepter>
<intercepter-ref name="defaultStack"/>
全局常量的默认值是2M,如果要限制文件大小小于2M,两种方式任选其一;
如果要限制文件大小大于2M,则全部常量必须设置为大于或等于目标大小,拦截器可选。
限制文件上传的类型:
给fileUpload拦截器添加参数:
<intercepter-ref name="fileUpload">
<param name="allowedTypes">image/jpeg,image/pjpeg,image/png,image/gif</param>
</intercepter>
<intercepter-ref name="defaultStack"/>
如果出现错误:HTTP Status 404 - No result defined for action com.pb.web.action.UploadAction and result input
则是表示当result是input时,没有在action中定义对应的result。
file文件域,只能取value,不能给value赋值
struts2学习笔记
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。