怎么配置才能使struts中的*do 映射 去掉 .do ,直接用没有后缀名的映射
怎样配置才能使struts中的*.do 映射 去掉 .do ,直接用没有后缀名的映射
1.一直想用struts弄成没有后缀名的请求,跟javaeye的一样,今天看了下struts的源代码,发现
它截取的是最后一个/和最后一个.之间的字符串当做struts-config.xml里配的action。如:
其实写一个
继承action,
主要是ActionServlet,阅读它的源代码可以看到它主要一直调用的是RequestProcessor类,这个类会调用你写的action的里的execute()方法。这就是继承的妙用,覆盖方法,它会直接调用子类的方法。
2.那么我们要做的就是覆盖RequestProcessor这个类,并配置到struts-config.xml
这样的话,actionServlet就会调用allController 对象,并会调用processPath();
这个方法就是截取action的,源代码是这样写的:
从最后几行可以看到是截取最后一个/和.之间的部分作为action,所以web.xml的urlpattern如果配置成/的话,比方说你的uri是http://localhost:8080/springStudy15/login.hhhhhhhhh
它照样可以访问到login 这个action,
所以覆盖这个方法,只截取/后面的东西。这样就成了~,哈哈~,真有成就感!,虽然还没找到工作~,哎~悲惨~
1.一直想用struts弄成没有后缀名的请求,跟javaeye的一样,今天看了下struts的源代码,发现
它截取的是最后一个/和最后一个.之间的字符串当做struts-config.xml里配的action。如:
<servlet-mapping> <servlet-name>action</servlet-name> <!-- <url-pattern>/usermgr/*</url-pattern> --> <url-pattern>/</url-pattern> </servlet-mapping>
其实写一个
public class LoginAction extends Action
继承action,
主要是ActionServlet,阅读它的源代码可以看到它主要一直调用的是RequestProcessor类,这个类会调用你写的action的里的execute()方法。这就是继承的妙用,覆盖方法,它会直接调用子类的方法。
2.那么我们要做的就是覆盖RequestProcessor这个类,并配置到struts-config.xml
<!--用于定义RequestProcessor类它截取URI最后一个/后面的字符串,就当做action --> <controller processorClass="com.bjsxt.usermgr.controller.allController"> </controller>
public class allController extends RequestProcessor{ @Override protected String processPath(HttpServletRequest request, HttpServletResponse response) throws IOException { // TODO Auto-generated method stub String path; // Set per request the original path for postback forms if (request.getAttribute(Globals.ORIGINAL_URI_KEY) == null) { request.setAttribute(Globals.ORIGINAL_URI_KEY, request.getServletPath()); } // For prefix matching, match on the path info (if any) path = (String) request.getAttribute(INCLUDE_PATH_INFO); if (path == null) { path = request.getPathInfo(); } if ((path != null) && (path.length() > 0)) { return (path); } // For extension matching, strip the module prefix and extension path = (String) request.getAttribute(INCLUDE_SERVLET_PATH); if (path == null) { path = request.getServletPath(); } String prefix = moduleConfig.getPrefix(); if (!path.startsWith(prefix)) { String msg = getInternal().getMessage("processPath"); log.error(msg + " " + request.getRequestURI()); response.sendError(HttpServletResponse.SC_BAD_REQUEST, msg); return null; } path = path.substring(prefix.length()); int slash = path.lastIndexOf("/"); //int period = path.lastIndexOf("."); path = path.substring(0); System.out.println(path); return (path); } } {
这样的话,actionServlet就会调用allController 对象,并会调用processPath();
这个方法就是截取action的,源代码是这样写的:
protected String processPath(HttpServletRequest request, HttpServletResponse response) throws IOException { String path; // Set per request the original path for postback forms if (request.getAttribute(Globals.ORIGINAL_URI_KEY) == null) { request.setAttribute(Globals.ORIGINAL_URI_KEY, request.getServletPath()); } // For prefix matching, match on the path info (if any) path = (String) request.getAttribute(INCLUDE_PATH_INFO); if (path == null) { path = request.getPathInfo(); } if ((path != null) && (path.length() > 0)) { return (path); } // For extension matching, strip the module prefix and extension path = (String) request.getAttribute(INCLUDE_SERVLET_PATH); if (path == null) { path = request.getServletPath(); } String prefix = moduleConfig.getPrefix(); if (!path.startsWith(prefix)) { String msg = getInternal().getMessage("processPath"); log.error(msg + " " + request.getRequestURI()); response.sendError(HttpServletResponse.SC_BAD_REQUEST, msg); return null; } path = path.substring(prefix.length()); int slash = path.lastIndexOf("/"); int period = path.lastIndexOf("."); if ((period >= 0) && (period > slash)) { path = path.substring(0, period); } return (path); }
从最后几行可以看到是截取最后一个/和.之间的部分作为action,所以web.xml的urlpattern如果配置成/的话,比方说你的uri是http://localhost:8080/springStudy15/login.hhhhhhhhh
它照样可以访问到login 这个action,
所以覆盖这个方法,只截取/后面的东西。这样就成了~,哈哈~,真有成就感!,虽然还没找到工作~,哎~悲惨~