增強HttpServlet實現類似于Struts的配置
增強HttpServlet實現類似于Struts的配置
頁面的轉發和重定向,都必須要在web.xml中進行配置。實現程序的可配置的功能。
通過反射,在接收到目標servlet的返回的字符串以后。如果不是null。則決定是轉發還是重定向到目標頁面。
以下是完整源代碼:
package cn.itcast.pubs;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 用戶繼承此類,處理多方法,接收用戶的返回值轉發或是重定向到其他資源<br/>
* 如果是重定向可以向request中設置名稱為param的屬性,<br/>
* 即request.setAttribute("param","name=Jack");<br/>
* 默認為轉發<br/>
* 如果不希望此工具類為你轉發,則可以返回null值
* @author <a href="wangjian_me@126.com">王健</a>
*/
public abstract class Base3Servlet extends HttpServlet{
private static final long serialVersionUID =
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");//此處應該通過過慮器(Filter)設置編碼
String cmd = req.getParameter("cmd");
if(cmd==null || cmd.trim().equals("")){
cmd = "execute";
}
try{
Method m = this.getClass().getMethod(cmd,HttpServletRequest.class,HttpServletResponse.class);
String result = (String) m.invoke(this,req,resp);
if(result!=null){
if(result.startsWith("redirect:")){
result = result.substring(result.lastIndexOf(":")+1); //截取redirect后面的值
String page = getPage(result);
//獲取參數,最后結果為some.jsp?name=Jack&...
String param=(String) req.getAttribute("param");
if(param!=null){
page = page+"?"+param;
}
System.err.println("page is :"+page);
if(page.startsWith("http")){
resp.sendRedirect(page);//重定向到外部網站
}else{
resp.sendRedirect(req.getContextPath()+page);//重定向到本網內的網頁
}
}else{
String page = getPage(result);
req.getRequestDispatcher(page).forward(req, resp);
}
}
}catch(NoSuchMethodException e){
throw new RuntimeException("沒有此方法:"+e.getMessage(),e);
}catch(Exception e){
throw new RuntimeException(e.getMessage(),e);
}
}
/**
* 先在此Servlet中查找,如果沒有則到Context中查找配置
*/
private String getPage(String result){
String page = getInitParameter(result); //獲取配置頁面,先在此Servlet中找,如果沒有則再找
if(page==null){
page = getServletContext().getInitParameter(result); //如果在servlet配置到找不到則找Context范圍
}
return page;
}
/**
* 要求返回一個String,根據String串獲取配置的初始化參數<br/>
* 轉發或是重新定向到目標頁面<br/>
* redirect:前綴為重定向,即return "redirect:page";<br/>
* 默認為轉發
*/
public abstract String execute(HttpServletRequest req,HttpServletResponse resp) throws Exception;
}
以下是使用示例:
配置示例如下:
<context-param>
<param-name>back</param-name>
<param-value>/jsps/result.jsp</param-value>
</context-param>
<servlet>
<servlet-name>back</servlet-name>
//以下BackStringServlet類,它繼承了Base3Servlet工具類
<servlet-class>cn.itcast.servlet.BackStringServlet</servlet-class>
<init-param>
//先在這兒查找back,如果這兒沒有,再查找Context的配置
<param-name>back</param-name>
<param-value>/jsps/result.jsp</param-value>
</init-param>
</servlet>
BackStringServlet.java源代碼如下:
package cn.itcast.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.pubs.Base3Servlet;
public class BackStringServlet extends Base3Servlet{
@Override
public String execute(HttpServletRequest req, HttpServletResponse resp)
throws Exception {
req.setAttribute("name", "Jack");
return "back";
//也可以按以下方式返回,redirect決定為重定向
//return "redirect:back";
}
}