struts2控制器及拦截器返回JSON格式数据

 

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 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

其他内容补充:

Strust2 拦截器处理返回自定义json格式数据

注意如果要使用拦截器返回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";
		}
	}
	
}

转载:Struts2+Jquery实现ajax并返回json类型数据

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Struts2 中,可以使用拦截器来实现权限控制。具体来说,可以编写一个自定义的拦截器,然后在 struts.xml 配置文件中将其配置为需要进行权限控制的 Action 的拦截器。以下是一个简单的权限拦截器示例: ```java public class AuthInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { // 获取当前用户 User user = (User) ActionContext.getContext().getSession().get("user"); // 判断用户是否拥有权限 if (user != null && user.hasPermission(invocation.getInvocationContext().getName())) { // 如果有权限,则继续执行 Action return invocation.invoke(); } else { // 如果没有权限,则跳转到错误页面 return "error"; } } } ``` 在上述代码中,我们首先获取了当前用户,然后判断用户是否拥有执行当前 Action 的权限。如果有权限,则继续执行 Action;否则,跳转到错误页面。 接下来,在 struts.xml 配置文件中,我们可以将该拦截器配置为需要进行权限控制的 Action 的拦截器,如下所示: ```xml <action name="myAction" class="com.example.MyAction"> <interceptor-ref name="authInterceptor"/> <result name="success">/myAction.jsp</result> <result name="error">/error.jsp</result> </action> <interceptor-stack name="authStack"> <interceptor-ref name="authInterceptor"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> <interceptors> <interceptor name="authInterceptor" class="com.example.AuthInterceptor"/> </interceptors> ``` 在上述代码中,我们首先定义了一个名为 authStack 的拦截器栈,该拦截器栈包含了 authInterceptor 和 defaultStack 两个拦截器。然后,我们将 myAction Action 配置为使用 authStack 拦截器栈。最后,我们定义了一个名为 authInterceptor 的拦截器,并将其添加到了 interceptors 中。 这样一来,当用户访问 myAction Action 时,就会先执行 authInterceptor 拦截器,进行权限控制,然后再执行 defaultStack 拦截器栈中的其它拦截器。如果 authInterceptor 拦截器返回了 error,则会跳转到 error.jsp 页面;否则,会跳转到 myAction.jsp 页面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值