标签:相关 ida ioc his cts ram method pointer 过滤
使用:导入 jar 包,配置 web.xml,并引入 struts.xml 文件
DMI:动态方法调用,调用时使用!分隔 action 名与方法名,如 index ! add.action,可以进行快捷测试
<!-- 需要修改配置文件,默认为false,需要修改为true -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
通配符:
<action name="\*_*" class="action.{1}Action" method="{2}">
<result>{1}_{2}.jsp</result>
</action>
结果类型:
redirectAction:重定向到某个action
跳转到另一个包中的action
<result name="loginSuccess" type="redirectAction">
<param name="namespace">/</param>
<param name="actionName">index</param>
<param name="method">index</param>
</result>
<result name="params" type="redirect">/params.jsp?t=${type}</result>
接收参数
访问web元素(request,session等)
Struts2读取配置文件顺序:
JSP转发到action失败,strus2默认不接受转发。解决:修改web.xml:
<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>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
必须添加如下配置:
使用struts2标签,非simple主题自动显示错误信息,simple主题可以使用标签
编程式验证:
声明式验证:xwork里的validation拦截器
在action包下添加ActionClassName-validation.xml(针对所有方法)
添加ActionClassName-alias-validation.xml(针对某个方法),alias为struts.xml下action标签的name属性
<validators>
<!-- 字段验证,fielderror -->
<field name="age">
<!-- 短路验证 -->
<field-validator short-circuit="true" type="conversion">
<message>类型转换出错</message>
</field-validator>
<field-validator type="int">
<param name="min">18</param>
<param name="max">70</param>
<!-- key引用国际化配置文件中的name -->
<message key="error.message"></message>
<!-- 在国际化配置文件中添加如下信息 -->
<!--
error.message=$(getText(fieldName)) needs to be betweents ${min} and ${max}
age=年龄
count=数量
-->
</field-validator>
</field>
<!-- 非字段验证,actionerror -->
<validator type="expression">
<param name="expression"><![CDATA[password==password2]]></param>
<message>两次密码输入不一致</message>
</validator>
</validators>
访问静态方法:
Math类的静态方法:
List:
Map.keys:
Map.values:
size:
// 投影:抽取集合中的某一列数据
// 选择:从集合中选取满足条件的数据
// ?表示获取满足指定条件的所有元素
选择所有的:
选择第一个:
判断为空:
数据标签:
property取值为字符串 :
property设定默认值 :
property解析html :
//注意使用%{str}将str强转为ognl表达式, 并注意OGNL与EL的结合使用
//
//其他标签都需要使用 % 将字符串强转为ognl表达式
<!-- select的两种用法:struts标签和jstl标签 -->
<s:select list="departments" listKey="id" listValue="name" value="model.department.id" headerKey="" headerValue="---请选择---"/>
<select>
<c:forEach items="${departments}" var="dept">
<!-- 注意相等是用 "==" 表示 -->
<option value="${dept.id}" <c:if test="${dept.id == model.department.id}">selected="selected"</c:if>>${dept.name }</option>
</c:forEach>
</select>
<!-- <s:select/>自定义列表内容 -->
<s:select list="#{'I':'调入','O':'调出'}" key="ajustLogModel.flag" headerKey="" headerValue="--请选择--"></s:select>
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("This is an ajax response from a struts Action.");
out.flush();
return null;
private InputStream inputStream;
public String delete() throws UnsupportedEncodingException {
trainService.delete(ids);
inputStream = new ByteArrayInputStream("1".getBytes("utf-8"));
return SUCCESS;
}
<!-- 以stream的方式传输ajax请求 -->
<result type="stream" name="deleteSuccess">
<param name="contneType">text/html</param>
<param name="inputName">inputStream</param>
</result>
form表单必须以 multipart/form-data 方式提交
//文件上传需要的参数,多文件改成数组即可
private File upload; //文件,名称对应input中file类型的name值
private String uploadFileName; //文件名称,setter方法必须为:setUploadFileName
private String uploadContentType; //文件的MIME类型,setter方法必须为:setUploadContentType
private void upload(Product product) throws IOException {
//删除上传的图片
String path = product.getImage();
if (path != null) {
String realPath = ServletActionContext.getServletContext().getRealPath("/" + path);
File file = new File(realPath);
file.delete();
}
if (upload != null) {
//获取文件上传的磁盘的绝对路径
String realPath = ServletActionContext.getServletContext().getRealPath("/products");
//创建一个文件
File diskFile = new File(realPath + "//" + uploadFileName);
//文件上传
org.apache.commons.io.FileUtils.copyFile(upload, diskFile);
product.setImage("products/" + uploadFileName);
}
}
<!-- 配置其它上传参数需要使用拦截器 -->
<constant name="struts.multipart.maxSize" value="107374182400" />
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/bmp,image/jpeg,image/jpg,image/png,image/gif</param>
<param name="maximumSize">2M</param>
</interceptor-ref>
<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.NullPointerException"></exception-mapping>
</global-exception-mappings>
需要为error配置一个全局结果集,前台使用struts标签或ognl表达式获取:${exception.message}
<interceptors>
<interceptor name="timer" class="interceptor.MyInterceptor" />
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="timer" />
</interceptor-stack>
</interceptors>
<interceptor-ref name="myStack"/>
拦截器和过滤器区别
<constant name="struts.i18n.encoding" value="utf-8"></constant>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.i18n.encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
几个配置文件加载顺序:default.properties > struts.xml > web.xml
首先,客户端发出请求,经三个过滤器(ActionContextCleanUp(可选),其他过滤器,到StrutsPrepareAndExecuteFilter(新版),此过滤器询问ActionMapper该请求是否属于struts2请求,是就将请求处理交给ActionProxy,ActionProxy通过ConfigurationManager 加载配置文件struts.xml,找到请求对应的Action类,然后创建一个ActionInvocation实例,根据配置文件struts-default.xml循环调用action相关的拦截器,每执行完一个拦截器,会继续调用invocation的invoke方法,把请求传给下个拦截器,所有的拦截器执行完以后,会调用Action,action执行完毕后返回一个result,通常是jsp或FreeMarker模板,渲染结果生成动态页面(struts2标签等),此时还没有完毕,继续按照相反顺序调用相关拦截器,最后将结果返回。
标签:相关 ida ioc his cts ram method pointer 过滤
原文地址:https://www.cnblogs.com/mabaoqing/p/10346140.html