優雅自定義請求&servlet方法呼叫一體化
阿新 • • 發佈:2018-12-13
開篇
新入手java開發,在學習servlet的過程中,大家都知道sevlet是請求響應模式,那麼一個httpservlet之定義了service(),doget(),dopost()方法,極大的限制開發效率,如何做到網路請求就像呼叫java中的函式一樣輕鬆?,接下來就該問題簡單聊一聊個人想法。
Filter分發請求
過濾器在站點初始化的時候會init,通過在web.xml中的url-pattern配置,所有的該路徑下的請求都會最先通過Filter的doFilter方法,那麼,我們就可以再該方法中分發我們的請求,前提是,我們要對URL進行處理,在去分發。
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//獲取web.xml中的init-param引數(擴充套件性強)
Log.e("Encoding-start");
String s = filterConfig.getInitParameter("sqlit");
if (s==null||s.equals("")){
sqlit = "!";
}else sqlit = s;
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//這裡可以強轉servletRequest的實質就是HttpServletRequest 物件
HttpServletRequest req = (HttpServletRequest) servletRequest;
String[] strs = req.getRequestURI().toString().split(sqlit);
if (strs.length>1)
servletRequest.setAttribute("method",strs[1]);
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=utf-8");
Log.e("Encoding-do" );
String context = servletRequest.getServletContext().getContextPath();
String dispatcherPath = strs[0].replace(context,"");
servletRequest.getRequestDispatcher(dispatcherPath).forward(servletRequest,servletResponse);
}
建立Servlet基類BaseAction
該基類我們要處理一件事,就是講請求分發至方法,不同的請求呼叫對應的方法。
package com.yzz.java.base;
import com.yzz.java.util.Log;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Created by yzz on 2017/9/6.
* mail:[email protected]
*/
public class BaseAction extends HttpServlet{
protected HttpServletRequest req;
protected HttpServletResponse resp;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.req = req;
this.resp = resp;
String method = (String) req.getAttribute("method");
try {
this.getClass().getMethod(method).invoke(this);
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用
整合BaseAction,然後使用跟普通的java類沒有任何區別
package com.yzz.java.action.cookie;
import com.yzz.java.base.BaseAction;
import com.yzz.java.util.Log;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
/**
* Created by yzz on 2017/9/6.
* mail:[email protected]
*/
public class CookieServlet extends BaseAction {
public void setCookie() throws Exception{
String name = req.getParameter("name");
Log.e(name);
Map<String,String[]> map = req.getParameterMap();
for (Map.Entry<String,String[]> en:map.entrySet()){
for (String str:en.getValue()) {
String encodestr = URLEncoder.encode(str,"utf-8");
Log.e(encodestr);
Cookie cookie = new Cookie(en.getKey(),encodestr);
cookie.setPath(getServletContext().getContextPath());
cookie.setHttpOnly(true);
cookie.setMaxAge(10);
resp.addCookie(cookie);
}
}
resp.getWriter().write("已儲存cookie");
}
public void deleteCookie() throws Exception{
Cookie[] cookie = req.getCookies();
for (Cookie c:cookie){
c.setMaxAge(0);
resp.addCookie(c);
}
resp.getWriter().write("刪除成功");
}
}