1. 程式人生 > >傳統java web工程簡介

傳統java web工程簡介

理解 對他 不能 exce 組合 charset onf client 結果

記錄一下java web工程的熟悉過程.

工程結構

首先從工程結構,應用分層開始.
一個好的工程可以最大程度復用已有代碼.從而保證效率.這也是一個好的工程結構需要做到的事情.

經典的工程結構如下圖所示, 分為5層, 每層處理不同業務邏輯. 通常下層代碼不能調用上層代碼. 通過manager的組合封裝 可以更好地復用代碼.
技術分享圖片
具體細節可以在中看到[阿裏java開發手冊]
(https://github.com/alibaba/p3c/blob/master/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C%EF%BC%88%E8%AF%A6%E5%B0%BD%E7%89%88%EF%BC%89.pdf)

web.xml 文件作用

在最初的java web 工程中, 使用web.xml作為項目的配置文件, 用來配置Filter,Listener,Servlet等.
web容器的加載順序ServletContext -> context-param -> listener -> filter -> servlet。
其中值得註意的點是:

  1. servlet配置中通過 來控制servlet啟動順序.
  2. 不同開發/部署環境可以通過jar包外web.xml對配置屬性進行覆蓋.避免重復修改. 當然機器多了web.xml修改也是一件非常頭痛的問題.這也是我理解的為什麽需要對他進行優化的原因之一.

具體細節可以參考這篇博文這裏就不細講了 https://www.jianshu.com/p/285ad45f60d1
但是由於種種原因web.xml並不是非常理想的項目配置方式. 例如隨著項目擴大而變得巨大的特性等等.
,隨著servlet3.0規範, 通過註解, 取代了web.xml中對servlet, filter等的配置. 再到後來springboot利用註解完全不再需要web.xml進行配置.
當然,在只使用的情況下我們並不需要知道具體細節.

代碼細節

Servlet層(請求及響應)

servlet層負責解析請求, 並將請求結果返回到client端. 在不使用任何框架情況下. 使用javax.servlet中的類來進行解析請求. 將協定好的字符串(通常是json)寫入到ServletOutputStream中返回到請求端.

public class XXServlet extends HttpServlet{
    public static final ObjectMapper OBJ_MAPPER = new ObjectMapper();
    static {
        OBJ_MAPPER.configure(Feature.ALLOW_SINGLE_QUOTES, true);
        OBJ_MAPPER.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
    }
    // 使用xml中的參數初始化servlet
    @Override
    public void init(ServletConfig config) throws ServletException 
    {
        super.init(config);
    }
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        request.setCharacterEncoding(DEF_CHARSET);
        String xx = request.getParameter("xx");
        xx= new String(xx.getBytes("ISO-8859-1"),"utf-8");  
        Result result = new result();
        String json = OBJ_MAPPER.writeValueAsString(result);
        writeResponse(response, json);
    }
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    ....same as doGet;
    }
    private void writeResponse(HttpServletResponse response, String str)
        throws IOException {
        response.setContentType("text/json; charset=utf-8");
        ServletOutputStream os = response.getOutputStream();
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os,
            DEF_CHARSET));
        bw.write(str);
        bw.close();
    }
}

Service, Manager層

這裏通常是java業務代碼. 值得註意的是tomcat等服務器會自動啟用多線程調用servlet類.因此Service, manager, dao層通常都采用單例的寫法, 以保證線程安全.

Dao層

以mysql為例. 采用jdbc連接池的方式進行連接.具體細節也不展開說了.
使用時可能會存在的一些問題(不止是數據庫, 也可能是其他數據源).

  1. try catch後結果沒有clear. 導致數據出問題.
  2. getConnection後沒有關閉導致線程超時.

接下來會簡要介紹一下springboot 的使用.

傳統java web工程簡介