`
minzaipiao
  • 浏览: 148590 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

处理*.do的请求

    博客分类:
  • Java
阅读更多
public class ServiceServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html; charset=GB18030");
		request.setCharacterEncoding("GB18030");
		response.setCharacterEncoding("GB18030");
		
		PrintWriter out = response.getWriter();
		
		DofContext.setRequest(request);
		DofContext.setResponse(response);

		// 根据url得到actionName
		String actionName = getActionName(request);
		String methodname = request.getParameter("action");

		// 执行action中的方法
		DofInvocation invocation = new DofInvocation(actionName);
		String resultString ="";
		try {
			resultString = invocation.execute(methodname);
		} catch (Exception e) {
			e.printStackTrace();
		}
		// 返回结果
		 out.print(resultString);
	}
	
	//分析uri得到action的name
	private String getActionName(HttpServletRequest request){
		String uri=request.getRequestURI();
		String actionName=uri.substring(uri.lastIndexOf("/")+1 , uri.indexOf(".do"));
		return actionName;
	}
	
	//把配置文件的map保存在Context里面
	public void init(ServletConfig config) throws ServletException {
		ServletContext context=config.getServletContext();
		Map<String ,Configuration> configMap=new HashMap<String, Configuration>();
		try {
			configMap=ParseDofConfFile.convertPropertyFileToMap();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		DofContext.setServletContext(context);
		DofContext.setConfigurationMap(configMap);
		System.out.println("===DOF初始化完毕====");
	}
}



解析配置文件
public class ParseDofConfFile {
	public static String ACTION_CONF_FILE = "DofConf.xml";
	private static final String S_Action = "action";
	private static final String S_Mapping = "class-mapping";
	private static final String S_ClassName = "class-name";

	/**
	 *  解析DofConf.xml文件,将解析出来的数据组装成configuration对象,并放入map中
	 */
	@SuppressWarnings("unchecked")
	public static Map<String, Configuration> convertPropertyFileToMap()
			throws IOException {
		Map<String, Configuration> actionResultMap = new HashMap<String, Configuration>();
		InputStream fs = null;
		try {
			fs = ParseDofConfFile.class.getClassLoader().getResourceAsStream(
					ACTION_CONF_FILE);
			if (fs != null) {
				SAXReader saxReader = new SAXReader();
				Document doc = saxReader.read(fs);
				if (doc != null) {
					Element root = doc.getRootElement();
					if (root != null) {
						//取得action节点,并遍历它的只节点
						List actionlist = root.elements(S_Action);
						if (actionlist != null) 
						{
							Iterator it = actionlist.iterator();
							while (it.hasNext()) 
							{
								Element actionele = (Element) it.next();
								if (actionele != null) 
								{
									//得到class-mapping 和class-name 节点
									Element mapele = actionele.element(S_Mapping);
									Element nameele = actionele.element(S_ClassName);
									//如果节点不为空,将其值组装成Configuration对象放入map中
									if (mapele != null && nameele != null) 
									{
										String actionName = mapele.getText();
										String classname = nameele.getText();
										Configuration conf = new Configuration();
										conf.setActionName(actionName);
										conf.setClassName(classname);
										actionResultMap.put(actionName, conf);
									}
								}

							}
						}
					}
				}
			}
		} 
		catch (Exception e) {
			throw new IOException("解析DofConfig.xml文件出错或文件不存在!");
		} finally {
			if (fs != null) {
				fs.close();
				fs = null;
			}
		}
		return actionResultMap;
	}

}


configuration对象
public class Configuration {

	//请求的action名称
	private String actionName;

	//action对应的类名
	private String className;

	
	public String getActionName() {
		return actionName;
	}

	public void setActionName(String actionName) {
		this.actionName = actionName;
	}

	public String getClassName() {
		return className;
	}

	public void setClassName(String className) {
		this.className = className;
	}
	
	public String toString(){
		return "actionName="+this.actionName+";classname="+this.className;
	}
}



dofContext
public class DofContext {

	//save actioncontext to a map
	private  static Map<String,Object> context=new HashMap<String, Object>();
	
	private DofContext(){
	}
	
	public static Map<String, Object> getContext() {
		return context;
	}

	public static HttpServletRequest getRequest(){
		return (HttpServletRequest)getContext().get(ContextConstant.HTTP_REQUEST);
	}
	
	public static void setRequest(HttpServletRequest request){
		getContext().put(ContextConstant.HTTP_REQUEST, request);
	}
	

	public static HttpServletResponse getResponse(){
		return (HttpServletResponse)getContext().get(ContextConstant.HTTP_RESPONSE);
	}
	
	public static void setResponse(HttpServletResponse response){
		getContext().put(ContextConstant.HTTP_RESPONSE, response);
	}
	

	public static void setServletContext(ServletContext servletContext){
		getContext().put(ContextConstant.SERVLET_CONTEXT, servletContext);
	}
	

	public static ServletContext getServletContext(){
		return (ServletContext)getContext().get(ContextConstant.SERVLET_CONTEXT);
	}
	

	public static void setConfigurationMap(Map<String,Configuration> configMap){
		getContext().put(ContextConstant.ACTION_CONFIG_MAP, configMap);
	}
	
	@SuppressWarnings("unchecked")
	public static Map<String,Configuration> getConfigurationMap(){
		return (Map<String,Configuration>)getContext().get(ContextConstant.ACTION_CONFIG_MAP);
	}
}

/**
 * 通过反射机制调用action中的方法
 * @author dengm
 *
 */
public class DofInvocation {
	private String actionName;

	public DofInvocation(String actionName) {
		this.actionName = actionName;
	}

	// 执行action中的方法
	@SuppressWarnings("unchecked")
	public String execute(String methodName) throws Exception {
		Configuration config = getActionConfiguration();
		if (null != config) {
			String className = config.getClassName();
			if (null == methodName || "".equals(methodName)) {
				methodName = "execute";
			}
			try {
				Class actionClass = Class.forName(className);
				Object action = actionClass.newInstance();
				Method method = action.getClass().getMethod(methodName, null);
				String result = (String) method.invoke(action, null);
				return result;
			} catch (ClassNotFoundException e) {
				throw new Exception("配置文件中没有找到类:" + className);
			} catch (InstantiationException e) {
				
			} catch (NoSuchMethodException e) {
				throw new Exception("类 :" + className + "中没有相应的方法 >>>"
						+ methodName);
			} catch (Exception e) {
				throw new Exception(e.getMessage());
			}

		}
		return ContextConstant.ACTION_ERROR;
	}

	/*
	 * 得到一个action的configuration配置对象
	 */
	@SuppressWarnings("unchecked")
	public Configuration getActionConfiguration() {
		Configuration config = new Configuration();
		Map<String, Configuration> configMap = (Map<String, Configuration>) DofContext
				.getConfigurationMap();
		if (null != configMap) {
			config = configMap.get(actionName);
		}
		return config;
	}

}


分享到:
评论

相关推荐

    springboot2 配置多个DispatcherServlet 处理.do .htm请求,Controller分离,集成druid和mybatis

    Springboot 2.4.4 网上搜到的配置多个DispatcherServlet 都有坑,自己避坑写的一个demo,处理.do .htm请求,Controller分离不会出现一个Controller可以处理.do也处理.htm可自己扩展.action .json等,适合分离前台...

    springboot+jsp 使用过滤器.do

    综上所述,"springboot+jsp 使用过滤器.do"这个项目展示了如何在Spring Boot应用中集成JSP页面,并通过Maven管理项目,同时利用过滤器实现特定的HTTP请求处理逻辑。通过学习这个示例,开发者可以更好地理解Spring ...

    去掉.action去掉.do字样 隐藏struts2 URL地址action, strus1的扩展名do也是同理.zip

    Struts2和Struts1是两个非常著名的Java Web框架,它们在处理请求时通常会在URL中显式地显示.action或.do后缀。然而,为了提供更友好的用户体验和增强安全性,有时我们需要隐藏这些扩展名。本篇文章将详细介绍如何在...

    在web.xml中配置action或.do

    - **类路径**:`class`属性指定了处理请求的具体Action类。 - **结果**:`result`元素用于定义Action执行成功后转向的目标页面,本例中为`/next.jsp`。 2. **创建对应的Action文件** - 按照传统Struts框架的...

    java struts如何隐藏提交后缀.action, .do.zip

    这些后缀通常表示Struts框架处理请求的动作映射,暴露这些信息可能会让攻击者更容易发现系统的结构。以下是一些实现这一目标的方法和相关知识点: 1. **配置Action Mapping**: 在Struts的配置文件(如struts-...

    spring mvc 入门介绍

    - 配置 DispatcherServlet,用于拦截所有 *.do 结尾的请求。 - 配置 CharacterEncodingFilter,解决中文乱码问题。 **4. 实现登录逻辑** - 编写控制器类 (LoginController.java),负责处理登录请求。 - 通过 @...

    2019年中考英语复习第一组词组大全

    12. **ask sb to do sth**:请求某人做某事;**ask sb not to do**:让某人不要做某事。 13. **at the age of**:在...岁的时候,表示年龄。 14. **at the beginning of...**:在...的开始,常用于描述事件的起点...

    ajaxAnywhere配置

    - 上述示例中的`*.do`通常用于拦截Struts2的Action请求,如果使用Servlet,则需自定义一个后缀,如`*.aj`。 - **配置问题**:如果在使用Servlet时遇到“返回类型不是text/xml”的错误,这通常是由于请求未被...

    最全最经典spring_mvc教程

    3. **处理请求**: Handler处理请求,执行相应的业务逻辑,并返回ModelAndView对象。 4. **选择ViewResolver**: DispatcherServlet根据ModelAndView中的View名称选择合适的ViewResolver。 5. **渲染视图**: ...

    struts.xml中constent属性参数配置大全

    - **示例**:设置为`struts.action.extension=do`,则所有Action请求的URL将以`.do`结尾。 ##### 14. **struts.serve.static** - **功能**:是否允许静态资源通过JAR包提供服务,默认为`false`。 - **示例**:设置...

    Struts2配置文件详解

    - **示例**: `struts.action.extension=action,do`表示处理`.action`和`.do`两种后缀的请求。 - **注意事项**: 合理设置可以提高URL的友好性和安全性。 **14. struts.serve.static** - **功能**: 设置是否通过...

    中考英语八年级下册教材同步复习题14份23精选.doc

    6. **照顾,处理**:take care of 7. **快速查看,浏览**:look through 8. **重要的事**:big deal 9. **成功地发展,解决**:work out 10. **和睦相处,关系良好**:get on with 11. **删除,删去**:cut out 12. ...

    多星宇贴吧签到助手 v10.0

    4. **ajax.php**:可能用于处理异步请求,例如与服务器交互以获取签到状态或更新数据。 5. **index.php**:通常是程序的入口文件,负责加载其他组件并启动应用。 6. **init.php**:可能包含了程序初始化的代码,用于...

    365美国人最爱的口语1

    3. **All I have to do is learn English.** 这句话展示了用英语表达自己目标的简单方式,强调了学习英语的重要性。 4. **Are you free tomorrow?** 这是一种询问对方是否有空闲时间的方式,常用于安排约会或活动。...

    java小结txt文档

    2. **通配符匹配**:使用`"*"`匹配所有请求,或使用`"*.do"`匹配所有以`.do`结尾的URL。 3. **请求处理**:通过`request.getRequestURI()`获取请求的URI,根据不同的映射规则执行相应的Servlet。 #### 四、Servlet...

    ajax异步请求小结

    - **GET请求**: ```javascript xhr.open('get', 'check_uname.do?username=tom', true); xhr.onreadystatechange = handler; xhr.send(null); ``` - **POST请求**: ```javascript xhr.open('post', '...

    AjaxJquery入门

    5. **服务器处理请求**: 服务器接收请求,处理数据。 6. **返回响应**: 服务器将处理结果以HTTP响应的形式返回。 7. **接收数据**: JavaScript代码接收服务器的响应,并根据需求处理数据。 8. **回调函数执行**: ...

    javaweb乱码

    *.do ``` 3. **GET请求处理**:对于GET请求,由于参数直接包含在URL中,无法通过`setCharacterEncoding`来设置编码。这时可以手动转换字节流,如将ISO8859-1编码的字节流转为UTF-8。 ```java String name = ...

    struts.properties配置详解

    - **示例**:默认情况下,该属性的值为`do,action`,这意味着Struts2将处理以`.do`或`.action`结尾的URL请求。 - **配置**: ```properties struts.action.extension=do,action ``` - **应用场景**:例如,如果...

Global site tag (gtag.js) - Google Analytics