1. 程式人生 > >優雅自定義請求&servlet方法呼叫一體化

優雅自定義請求&servlet方法呼叫一體化

開篇

新入手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("刪除成功");
    }
}

總結

本工具尚未實現將body的引數轉化為Bean像SpringMVC一樣,由於時間問題,我就不做這塊了,下次再補充。歡迎交流,各位大佬。