1. JSON插件
想要使用json必定会用到jquery。
1.1 导入相关的Ajax-jar包-01资料中ajax文件中。
commons-beanutils-1.8.0.jar commons-collections-3.1.jar commons-lang-2.4.jar commons-logging-1.1.3.jar ezmorph-1.0.6.jar jackson-core-asl-1.9.2.jar jackson-mapper-asl-1.9.2.jar json-lib-2.3-jdk15.jar struts2-json-plugin-2.3.24.jar 还要有struts2的相关jar包。 |
1.2 创建对应的页面。Success.jsp
<script type="text/javascript" src="js/jquery-3.2.1.min.js"></script> <script type="text/javascript"> $(function(){ /* 使用ajax技术进行提交 */ $.ajax({ type:"post", url:"/07struts2/getAll.action", dataType:"json", success:function(data){ /* 回调函数将data对象中的数据循环添加到页面中 */ for(var i = 0 ; i < data.length; i++){ var con = "<tr><td>"+data[i].id+"</td><td>"+data[i].name+"</td><td>"+data[i].pwd+"</td></tr>"; // 添加con $("#tab").append(con); } } }) }) </script> |
1.3 要完成对应的Action-- getAll.action
// 模拟数据库为user对象添加数据 private List<User> userList; public String getAll(){ // 需要给user赋予数据 模拟的是数据库。从服务层取得到的数据。 userList = new ArrayList<>(); userList.add(new User(1, "高圆圆", "2345")); userList.add(new User(2, "宋慧乔", "32345")); userList.add(new User(3, "唐嫣", "12345")); userList.add(new User(4, "陈乔恩", "24345")); userList.add(new User(5, "赵丽颖", "25345")); userList.add(new User(6, "陈冠希", "256345")); return SUCCESS; } |
1.4 编写struts.xml—将getAll.action 添加
<!-- Struts 要想使用json技术,必须继承json-default: 才可以使用json技术 struts 继承多个命名空间的时候,要使用,隔开即可! --> <package name="default" namespace="/" extends="struts-default,json-default"> <action name="getAll" class="com.bjsxt.action.LoginAction" method="getAll"> <!-- 表示该方法返回一个json --> <result type="json"> <!-- param:给userList属性从新装备 root:表示根,直接将userList可以转化为json --> <param name="root">userList</param> </result> </action> |
1.5 测试成功!
2. 拦截器
1.只能拦截Action类,
2.在Action类后端控制器的前面或后面执行一些操作(AOP)
3.Struts2已提供了多个拦截器
4.默认使用struts2提供的拦截器
5.使用自定义拦截器会覆盖掉struts2提供的拦截器
6.在使用自定义拦截器时使用struts2提供的拦截器,需要引用struts2提供的默认拦截器
Struts2 同拦截器栈interceptor-stack定义了很多内部实现好的拦截器。
拦截器栈通过<interceptor-ref name="exception"/> 引用了内部定义的多个拦截器。
2.1定义单个拦截器:
2.1.1自定义拦截器继承AbstractInterceptor
2.1.2在struts.xml中添加<interceptors>标签引用拦截器
2.1.3在Action标签中直接引用拦截器<interceptor-ref name="myInter"></interceptor-ref>
单个拦截器执行的顺序:intercept方法中可以定义在走Action之前的一些操作。arg0.invoke(); 判断是否有其他拦截器,如果有则执行其他拦截器,如果没有则走具体的Action。执行完Action之后,也可以自定义一些操作。
InterCeptor
public class MyInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation arg0) throws Exception {
System.out.println("-----------执行之前--------");
// invoke();动态代理:
arg0.invoke(); // 如果有下一个拦截器,则invoke方法会继续执行下一个拦截器。如果没有,就执行当前。
System.out.println("----------执行之后----------");
return null;
}
}
Struts.xml
2.2定义多个拦截器:
2.2.1自定义拦截器继承AbstractInterceptor
2.2.2在struts.xml中添加<interceptors>标签引用多个拦截器
2.2.3 添加拦截器栈<interceptor-stackname="myStack">
2.2.4在Action标签中直接引用拦截器<interceptor-ref name="myStack"></interceptor-ref>
追加内容:可以用param标签来区分哪些方法被拦截,哪些方法不被拦截
<interceptor-ref name="myStack">
<param name="includeMethod">execute</param>//要拦截的方法
<param name="excludeMethod">myfun</param>//不拦截的方法。
</interceptor-ref>
结论:多个拦截器的顺序---先进后出:多个拦截器执行的顺序!跟配置文件中配置属性有直接关系跟springmvc一样!
2.3 struts---全局默认拦截器。
指的是struts-default.xml 中<default-interceptor-refname="defaultStack"/>
2.3.1 解决值没有传递过来的问题!
Interceptor:
拦截器中可以创建作用域对象:request,session,application。
2.4登录拦截器:
2.4.1 在登录的Action中将用户存入到session中
// 需要自定义方法
public String doLogin(){
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
System.out.println("点我带你飞!轻松上王者");
if ("admin".equals(user.getName())) {
session.setAttribute("user", user);
return SUCCESS;
}else{
return ERROR;
}
}
2.4.2 创建一个拦截器,判断用户是否登录成功!
public class MyInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation arg0) throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
System.out.println(user+"------------");
if (user!=null) {
System.out.println("登录成功!");
return arg0.invoke();
}else{
return "error";
}
}
}
2.4.3 配置拦截器。struts.xml
<!-- 配置拦截器 -->
<interceptors>
<interceptor name="myInter" class="com.bjsxt.interceptor.MyInterceptor"/>
<!-- 拦截器的执行顺序拦截器栈 -->
<interceptor-stack name="mystack">
<interceptor-ref name="myInter"/>
</interceptor-stack>
</interceptors>
<!-- 配置全局error -->
<global-results>
<result name="error">/error.jsp</result>
</global-results>
配置要拦截的方法
<action name="getAll" class="com.bjsxt.action.DoLoginAction" method="getAll">
<interceptor-ref name="mystack">
<param name="includeMethod">getAll</param>
</interceptor-ref>
<result type="json">
<param name="root">userList</param>
</result>
</action>
2.4.4 测试
2.4.4 测试
---------------------
作者:孟庆祥
来源:CSDN
原文:https://blog.csdn.net/m_q_x/article/details/78084696
版权声明:本文为博主原创文章,转载请附上博文链接!
其他内容补充:
注意如果要使用拦截器返回json字符串时,需要使用反射内容调用action类调用返回值(属性变量set方法进行设置),否则变量将使用属性默认值作为JSON返回值字符串:
struts2拦截器配置文件代码:
<package name="/testServices/" extends="struts-default,json-default">
<!-- 配置拦截器 -->
<interceptors>
<interceptor name="myInterceptor" class="com.MyInterceptor" />
<interceptor-stack name="myDefault">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="myInterceptor" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myDefault" />
<!-- 配置全局跳转结果 error , 拦截器中错误信息以JSON格式方式返回 -->
<global-results>
<!-- 拦截器中return ‘error’ 字符串时,指定返回json格式,responseData为需要转换json格式的类属性(即当前拦截的action类),在action类中已定义-->
<result name="error" type="json">
<param name="root">responseData</param>
</result>
</global-results>
<action name="getTestService" class="com.TestAction" method="getTestService">
<result name="success" type="json">
<!-- responseData为需要转换json格式的类属性,需在action类中定义 -->
<param name="root">responseData</param>
</result>
</action>
</package>
拦截器类文件代码:
public class MyInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation arg0) throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
String requestMethod = request.getMethod();
System.out.println("当前客户端请求方式: " + requestMethod);
if(requestMethod.equalsIgnoreCase(Constants.REQUEST_METHOD_POST))
{
System.out.println("POST请求");
return arg0.invoke();
}
else
{
System.out.println("GET请求");
Response responseData = new Response();
responseData.setCode(Constants.CODE_5002);
responseData.setDesc(Constants.DESC_5002);
//通过反射设置数据
Method method = arg0.getProxy().getAction().getClass().getMethod("setResponseData", Response.class);
method.invoke(arg0.getProxy().getAction(), responseData);
return "error";
}
}
}