java基于包结构的请求路由实现实例分享
WebFilter.java
package com.hongyuan.route;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class WebFilter implements Filter {
public static final String BASE_PACKAGE="com.hongyuan";
public static final String CLASS_FLAG="Action";
@Override
public void destroy() {}
@Override
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
if(!hasResouce(request)){
String requestPath=((HttpServletRequest)request).getServletPath();
if(requestPath.indexOf(".")>=0){
requestPath=requestPath.substring(0, requestPath.indexOf("."));
}
if(requestPath.endsWith("/")){
requestPath=requestPath.substring(0, requestPath.length()-1);
}
//获取请求的类全限定名
String className=BASE_PACKAGE+requestPath.replaceAll("/", ".")+CLASS_FLAG;
//获取请求方法名称
String methodName=request.getParameter("method");
if(methodName==null||"".equals(methodName.trim())){
methodName="index";
}
try {
//获取处理类并响应请求
Class clazz=Class.forName(className);
Object instance=this.initContext(clazz,request,response);
Method method=clazz.getMethod(methodName, new Class[]{});
Object result=method.invoke(instance, new Object[]{});
response.getWriter().print(result);
} catch (Exception e) {
e.printStackTrace(response.getWriter());
}
}else{
chain.doFilter(request, response);
}
}
//判断是否存在请求的资源
private boolean hasResouce(ServletRequest request) {
String realPath=request.getServletContext().getRealPath(((HttpServletRequest)request).getServletPath());
File resouce=new File(realPath);
if(resouce.exists()){
return true;
}else{
return false;
}
}
//初始化上下文
private Object initContext(Class clazz, ServletRequest request,
ServletResponse response) throws Exception{
Object instance=clazz.newInstance();
clazz.getMethod("setRequest",new Class[]{ServletRequest.class}).invoke(instance, new Object[]{request});
clazz.getMethod("setResponse", new Class[]{ServletResponse.class}).invoke(instance, new Object[]{response});
return instance;
}
@Override
public void init(FilterConfig arg0) throws ServletException {}
}
BaseAction.java
package com.hongyuan.route;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public abstract class BaseAction {
protected ServletRequest request=null;
protected ServletResponse response=null;
public ServletRequest getRequest() {
return request;
}
public void setRequest(ServletRequest request) {
this.request = request;
}
public ServletResponse getResponse() {
return response;
}
public void setResponse(ServletResponse response) {
this.response = response;
}
}
- Android 中HttpURLConnection与HttpClient使用的简单实例
- Android HttpURLConnection.getResponseCode()错误解决方法
- java实现http请求工具类示例
- java发送get请求和post请求示例
- java发送url请求获取返回值的二种方法
- java使用httpclient模拟post请求和get请求示例
- java模拟post请求登录猫扑示例分享
- JAVA发送HTTP请求,返回HTTP响应内容,应用及实例代码
- java使用httpclient发送post请求示例
- java网络编程中向指定URL发送GET POST请求示例
- java后台调用HttpURLConnection类模拟浏览器请求实例(可用于接口调用)
相关文章
SpringBoot中的@ConfigurationProperties注解解析
这篇文章主要介绍了SpringBoot中的@ConfigurationProperties注解解析,Spring源码中大量使用了ConfigurationProperties注解,通过与其他注解配合使用,能够实现Bean的按需配置,该注解可以放在类上,也可以放在方法上,需要的朋友可以参考下2023-11-11
SSH框架网上商城项目第1战之整合Struts2、Hibernate4.3和Spring4.2
SSH框架网上商城项目第1战之整合Struts2、Hibernate4.3和Spring4.2,感兴趣的小伙伴们可以参考一下2016-05-05


最新评论