论坛首页 Java企业应用论坛

怎样获取action的name或者method

浏览 7799 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-12-12  
我想实现一个功能,就是在页面每次发起请求的时候,我通过过滤器来获取这个action的name或者method。
<action name="queryh" class="cn.com.norm.web.action.QueryAction" method="queryByHttp">
		<result type="json" />
</action>


如果我在具体执行的方法中加入下面代码,是可以正确获取到这个属性的。
String getName = ServletActionContext.getActionMapping().getName();
System.out.println("-----getName----->>"+getName);


输出的就是上面配置文件中name的值:“ queryhp ”

但是我把上面这个代码写到过滤器中,就不行了,会报错。
package cn.com.faqm.tool;

import java.io.IOException;

import javax.servlet.*;

import org.apache.struts2.ServletActionContext;

public class OpFilter implements Filter {

        protected FilterConfig filterConfig;

        public void init(FilterConfig filterConfig) throws ServletException {
                this.filterConfig = filterConfig;
        }

        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterchain) throws IOException, ServletException {
                if(servletRequest.getParameter("actId") != null && !servletRequest.getParameter("actId").equals("")){
                        String getName = ServletActionContext.getActionMapping().getName();
                        System.out.println("-----getName----->>"+getName);
                }
                
                        
                filterchain.doFilter(servletRequest, servletResponse);
        }

        public void destroy() {
                this.filterConfig = null;
        }
}


错误信息如下:
2012-12-12 15:00:19 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet default threw exception
java.lang.NullPointerException
        at org.apache.struts2.ServletActionContext.getActionMapping(ServletActionContext.java:85)
        at cn.com.faqm.tool.OpFilter.doFilter(OpFilter.java:19)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        at java.lang.Thread.run(Thread.java:619)


这个问题在网上找了下,有类似问题,说是servlet或jsp中,重复调用response的 getOutputStream(),response.getWriter()方法。
请教一下,如果是上面这种说法导致的问题,应该怎么避免?
或者有没有别的方法可以在每次发起请求的时候都把action的name或者method获取到?
   发表时间:2012-12-12  
明显的空指针异常啊.

说明白点,
执行自定义的filter时,还没有执行Struts2的入口FilterDispher呢,因此出现空指针异常.

如果需要,去写struts的拦截器吧.
0 请登录后投票
   发表时间:2012-12-12  
lkclkc88 写道
明显的空指针异常啊.

说明白点,
执行自定义的filter时,还没有执行Struts2的入口FilterDispher呢,因此出现空指针异常.

如果需要,去写struts的拦截器吧.



你好,我还是不太明白,可以说的再详细一点么?谢谢
0 请登录后投票
   发表时间:2012-12-12  
添加一个拦截器

package com.tyyler.system;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.RequestProcessor;

public class CBBRequestProcessor extends RequestProcessor {
         public CBBRequestProcessor() {
	}

	@Override
	protected ActionForward processActionPerform(HttpServletRequest request,
			HttpServletResponse response, Action action, ActionForm form,
			ActionMapping mapping) throws IOException, ServletException {
		// TODO Auto-generated method stub
		
		System.out.println("权限验证==============>>>>>" + mapping.getPath());
		
		System.out.println("调用:action = " + action.getClass() + ",form = "
				+ form.getClass());
		
		return super.processActionPerform(request, response, action, form,
				mapping);
	}
}


在struts-config.xml文件中添加

<controller contentType="text/html;charset=UTF-8" locale="true" nocache="true"
processorClass="com.tyyler.system.CBBRequestProcessor "/>
0 请登录后投票
   发表时间:2012-12-12  
你需要使用的是struts的拦截器。。。
0 请登录后投票
   发表时间:2012-12-12  
struts的拦截器还没执行呢 ,你的先执行了,哪里得到去
0 请登录后投票
   发表时间:2012-12-13  
struts2 不能使用过滤器处理这些,要使用struts2提供的拦截器接口,这样非常方便的获取method
0 请登录后投票
   发表时间:2012-12-13  
谢谢大家,我已经获取到我需要的东西了,用我这种方式可以获取到每个请求的路径,虽然后缀是“.html”,但后缀前面的名字和struts.xml文件里面的name属性是对应的,而且已经可以把每个请求页面里面的所有属性都获取到。但是还有几个小问题:
1.userId我只能在登录的时候获得一次,后面就获取不到了,这是为什么?
2.我现在是在用户登录,第一次获取到userId的时候,用map来保存sessionId和userId,然后每次操作我就通过sessionId去map里面找userId,map可以保存多少条记录?我想在session失效的时候从map里面把对应的记录删除掉,请问应该怎么处理?

package cn.com.faqm.tool;

import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public class OpFilter implements Filter {

	protected Map<String, String> userSessionIdMap = new HashMap<String, String>();

	public void init(FilterConfig filterConfig) throws ServletException {
	}

		public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterchain) throws IOException, ServletException {

		HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
		HttpSession session = httpRequest.getSession();
		
		//actId为空时不进行处理
		if (servletRequest.getParameter("actId") != null && !servletRequest.getParameter("actId").equals("")) {
			String reqPath = httpRequest.getServletPath();
			//获取所有请求路径,只对".html"结尾的请求进行处理
			if(reqPath.endsWith(".html")){
				String userId = httpRequest.getParameter("userId");
				String sessionId = session.getId();
				//获取所有页面上传入的属性
				Enumeration en = servletRequest.getParameterNames();
				StringBuffer params = new StringBuffer();
				String paramName = "";
				String paramValue = "";
				while(en.hasMoreElements()){	//遍历所有属性,对有值的进行组装
					paramName = en.nextElement().toString();
					paramValue = servletRequest.getParameter(paramName);
					if(!paramName.equals("start")&&!paramName.equals("persize")){	//排除用于分页的两个属性
						if(paramValue!=null&&!paramValue.equals("")){
							 params.append("参数").append(paramName).append("->").append(paramValue).append(" - ");
						 }
					}
				}
				
				if(userId!=null&&!userId.equals("")){	//登录时才能获取到userId
					userSessionIdMap.put(sessionId, userId);	//保存对应的sessionId和userId
//					SysLogger.log(userId, "用户"+userId+"登录系统", params.toString().substring(0, params.toString().length()-3), sessionId);
				}else{
					//登录以后获取不到userId,通过sessionId从userSessionIdMap中获取userId
					if(userSessionIdMap.get(sessionId)!=null && !userSessionIdMap.get(sessionId).equals("")){
//						SysLogger.log(userSessionIdMap.get(sessionId), "发起请求->"+reqPath, params.toString().substring(0, params.toString().length()-3), sessionId);
					}
				}
			}
		}
		
		filterchain.doFilter(servletRequest, servletResponse);
	}

	public void destroy() {
	}
}
0 请登录后投票
   发表时间:2012-12-13  
struts2 中的拦截器 应该可以完成你所说的功能,而且代码应该比你现在写的简洁,楼主可以看看关于拦截器的文章。
0 请登录后投票
   发表时间:2012-12-13  
谢谢大家的指点,现在已经搞定了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics