struts2 配置xml、异步、上传文件、过滤器

怼烎@ 2021-12-05 06:09 313阅读 0赞

出了面试基本用不到,屡一下免得忘了。

struts2是一个Controller层框架,和springMVC的作用相同。

环境

IDEA+maven

配置

1、添加jar包struts2-core

  1. <dependency>
  2. <groupId>org.apache.struts</groupId>
  3. <artifactId>struts2-core</artifactId>
  4. <version>2.5.14.1</version>
  5. </dependency>

2、新建配置文件strus.xml
在这里插入图片描述

demo

1、创建struts2的action类,等价于springMVC的handler处理器类

  1. public class Sysuser {
  2. private String uname;
  3. private int uage;
  4. private String msg;
  5. public String test(){
  6. msg="测试信息";
  7. return "hello"; //对应result标签的name
  8. }
  9. public String test2(){
  10. msg="test2";
  11. return "gohello"; //对应result标签的name
  12. }

struts2的默认编码是utf-8,无需再设置编码过滤。

2、配置strus.xml

  1. <struts>
  2. <!--开启动态方法调用,针对于包禁止严格方法调用-->
  3. <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
  4. <!--name 自定 namespace 二级路径 extends 继承其他 package 关闭严格方法调用 -->
  5. <package name="syspackage" namespace="/sys" extends="json-default" strict-method-invocation="false">
  6. <!--三级路径 使用 "_方法名"风格的url指定action method 调用方法 此处调用*指定的action方法-->
  7. <action name="user_*" class="Sysuser" method="{1}">
  8. <!--1、当action类return的值为"hello" 返回到此页面-->
  9. <result name="hello">/WEB-INF/view/hello.jsp</result>
  10. <!--2、当action类return的值为"ttt2" 转发到此action-->
  11. <result name="gohello" type="chain">
  12. <param name="namespace">/sys</param>
  13. <param name="actionName">user_test</param>
  14. </result>
  15. </action>
  16. </package>
  17. </struts>

result常用的5中type:
dispatcher,服务端转发的jsp页(默认)
redirect:客户端重定向到jsp
chain:服务单转发的新的action处理器
redirectAction:客户端重定向到新的action
json:异步

3、创建hello.jsp页面
可以使用el表达式取出action类种的全局变量

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>返回的页面</title>
  5. </head>
  6. <body>
  7. xxxxx
  8. <hr/>
  9. <p>uname=${uname},uage=${uage},msg:${msg}</p>
  10. </body>
  11. </html>

4、测试
访问的同时传值

  1. http://localhost:8080/sys/user_test?uname=tom&uage=12

在这里插入图片描述
换成test2结果相同,同样是跳转到此页面

  1. http://localhost:8080/sys/user_test2?uname=tom&uage=12

异步

原生异步

ServletActionContext获取response对象,其他和Java原生异步一样。

  1. public void test3() throws IOException {
  2. HttpServletResponse hsr= ServletActionContext.getResponse();
  3. PrintWriter writer = hsr.getWriter();
  4. Sysuser user=new Sysuser();
  5. user.setUname("aimy");
  6. user.setUage(19);
  7. user.setMsg("异步请求");
  8. writer.print(JSON.toJSON(user));
  9. writer.flush();
  10. writer.close();
  11. }

获取servlet核心对象也是通过ServletActionContext

struts2异步

  1. public class Sysuser {
  2. private User user //异步返回的对象需要是成员变量;
  3. private String msg;
  4. public String test4(){
  5. user=new Sysuser();
  6. user.setUname("aimy");
  7. user.setUage(19);
  8. return "testajax";
  9. }

添加struts2-json-plugin.jar
struts.xml中package需要extends自 json-default;
result标签的type=json,param标签的name=root,param标签的值为action中的成员变量名称。

  1. <struts>
  2. <!--开启动态方法调用,针对于包禁止严格方法调用-->
  3. <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
  4. <!--name 自定 namespace 二级路径 extends 继承其他 package 关闭严格方法调用 -->
  5. <package name="syspackage" namespace="/sys" extends="json-default" strict-method-invocation="false">
  6. <!--三级路径 使用 "_方法名"风格的url指定action method 调用方法 此处调用*指定的action方法-->
  7. <action name="user_*" class="Sysuser" method="{1}">
  8. <!-- 3、当action类return的值为"ttt4" 异步返回全局变量user(自动转json字符串) -->
  9. <result name="testajax" type="json">
  10. <param name="root">user</param>
  11. </result>
  12. </action>
  13. </package>
  14. </struts>

4、测试
访问

  1. http://localhost:8080/sys/user_test4

在这里插入图片描述

接收前端的数据

user的数据也可以来自前端

  1. public class Sysuser {
  2. private User user //异步返回的对象需要是成员变量;
  3. private String msg;
  4. public String test4(){
  5. user=new Sysuser();
  6. return "testajax";
  7. }
  8. }

给成员变量的对象赋值,使用 user.uname这样的方式

  1. http://localhost:8080/sys/user_test4?user.uname=bom&user.uage=22

在这里插入图片描述

文件上传

写个页面

  1. <form action="user_uploadFile" method="post" enctype="multipart/form-data">
  2. <input type="file" name="jl">
  3. <button>上传</button>
  4. </form>

对应的action方法

File 对应input表单元素的name;
ContentType为表单元素名+ContentType,是文件的mime-type类型;
FileName为表单元素名+FileName,是真文件名;

  1. public class Sysuser {
  2. private File jl; //文件数据 表单元素名
  3. private String jlContentType; //文件mime-type类型 固定格式
  4. private String jlFileName; //文件名 固定格式
  5. public String uploadFile(){
  6. System.out.println(jlContentType);
  7. System.out.println(jlFileName);
  8. //获取保存路径
  9. String path=ServletActionContext.getServletContext().getRealPath("/upload");
  10. File uploadFile=new File(path);
  11. if(!uploadFile.exists()){
  12. uploadFile.mkdirs();
  13. }
  14. //将文件剪切到指定位置
  15. File target=new File(uploadFile+jlFileName);
  16. jl.renameTo(target);
  17. return "show";
  18. }
  19. }

配置xml
暂时先就把文件名传回去

  1. <result name="show" type="json">
  2. <param name="root">jlFileName</param>
  3. </result>

上传
上传后传回了文件名
在这里插入图片描述
文件被上传到了项目目录内
在这里插入图片描述

拦截器

写一个拦截器类

  1. public class LoginInterceptor extends MethodFilterInterceptor {
  2. @Override
  3. protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
  4. System.out.println("前置操作");
  5. actionInvocation.invoke();
  6. System.out.println("后置操作");
  7. return null;
  8. }
  9. }

在xml中配置此过滤器
要同时加入默认过滤器

  1. <package name="syspackage" namespace="/sys" extends="json-default" strict-method-invocation="false">
  2. <interceptors>
  3. <!-- class 路径 如果在包内要加上包名-->
  4. <interceptor name="LoginInterceptor " class="Interceptor"></interceptor>
  5. </interceptors>
  6. <action name="user_*" class="Sysuser" method="{1}">
  7. <interceptor-ref name="defaultStack"></interceptor-ref>
  8. <interceptor-ref name="loginInterceptor"></interceptor-ref>
  9. <!--限制文件上传大小 限制上传文件的后缀名 -->
  10. <param name="fileUpload.maximumSize">2048</param>
  11. <param name="fileUpload.allowedExtensions">jpg,bmp,png</param>
  12. ...

整合

为了便于维护,可以在每个包内建struts2-config.xml,再引入到struts2.xml中

struts2.xml

  1. <struts>
  2. <!--开启动态方法调用,针对于包禁止严格方法调用-->
  3. <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
  4. <!--各模块有自己的xml,统一包含到总得struts.xml -->
  5. <include file="com\sysuer\struts-config.xml"></include>
  6. <!--可以引入多个-->
  7. </struts>

发表评论

表情:
评论列表 (有 0 条评论,313人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Struts2文件

    笔者学习了Struts2文件上传和下载, 一、首先学习一下文件上传的原理: 表单元素的enctype属性: enctype属指定的是表单数据的编码方式,该属性有如下三个值

    相关 struts2文件

    可以关联到文件上传的值栈实现类FileUploadInterceptor ,然后直接看它的javadoc,里面有具体的用法和实例 ![这里写图片描述][SouthEast