初学java web之后,了解了jsp跟Servlet交互的过程。
具体过程如下:
- 创建一个servlet,并重写doPost和doGer方法
- 在MXL文件中配置servlet的接收请求的路径
- 在jsp中请求该路径
- 在servlet中写一个方法,在doPost或者doGet方法中判断传递过来的参数来实际调用哪一个方法
由上面步骤,我们会发现,如果在一个servlet中写很多方法,那岂不是要写很多判断;
下面是我个人想的简化上面过程的代码,实现了不用写判断,直接根据路径来实现请求的方法
第一步、实现Filter类,获取请求路径,判断请求的是方法还是页面,如果是页面则返回index.jsp
public class FilterDemo implements Filter {
static Demo demo=null; //serlvet类
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain chian) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest req=(HttpServletRequest)arg0;//获取request对象
HttpServletResponse resp=(HttpServletResponse)arg1;//获取request对象
String uri = req.getRequestURI();
if (uri.indexOf(".jsp")<0) {
demo.doGet(req, resp);
}else{
resp.sendRedirect("../index.jsp");
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
demo=new Demo();
}
}
第二步、实现继承servlet的Demo类
public class Demo extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//---加载类
try {
//假如请求路径是 端口/项目名/Main/doPos2
//获取请求路径
String uri = req.getRequestURI();
//分割请求路径
//分割之后就是{"",项目名,Main,doPos2}
String[] strs=uri.split("/");
//获取项目名的后一个路径
String str1=strs[2];
//获取项目名的后两个路径 --假如路径不存在,则返回404
String str2=strs[3];
//将包名和str1拼接路径,将类加载--报错则返回404
Class<?> c1=null;
c1 = Class.forName("com.xj.controller."+str1);
//获取无参构造方法
Constructor<?> constructor;
constructor = c1.getConstructor();
//将私有暴露
constructor.setAccessible(true);
//获取str2方法--报错则返回404
Method dd=c1.getDeclaredMethod(str2,HttpServletRequest.class,HttpServletResponse.class);
dd.setAccessible(true);
//调用方法并传递参数
dd.invoke(constructor.newInstance(), req,resp); } catch (Exception e) {
resp.sendRedirect("../404.jsp");
}
}
}
第三步、实现具体的方法
protected void doPos2(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.sendRedirect("/FangTieBa/index.jsp");
}
效果如下:
上述方法重点在于利用反射获取Servlet类和方法