Servlet常見使用和操作

文章內容

1.重定向
2.Cookie和Session操作
3.異常處理
4.文件上傳

以上使用大多是針對HttpRequest和HttpResponse進項操作,這兩個對象基本包含的與Http相關的參數和操作;

1.重定向

重定向主要分爲兩種方式,一種是服務器端通過RequestDispatcherforward的轉發請求,對客戶端是透明的;另一種是通過HttpResponse的sendRedirect,這種跳轉由客戶端來響應處理;

req.setAttribute("msg", message);
req.getRequestDispatcher("test.jsp").forward(req, resp);
//resp.sendRedirect("/index.jsp");

注:sendRedirect也可以通過setStatus() 和 setHeader() 方法一起使用來達到同樣的效果;

2.Cookie和Session操作

HttpRequest可通過getCookies()獲取到當前請求關聯的Cookie值,addCookie(Cookie )設置值;

同樣的,Session也是通過同樣的方式獲取,只是一個請求只能關聯一個Session,不過可以修改Session中的屬性值;

關於Cookie和Session的操作基本都已經被Cookie和Session類封裝好,可以直接使用;關於Cookie和Session的作用這裏就不介紹了;

Cookie[] cookies = req.getCookies();
StringBuilder sb = new StringBuilder();
for(Cookie c : cookies){
    sb.append(c.getName()+":"+c.getValue());
}
req.setAttribute("cookies", sb.toString());
req.setAttribute("msg", message);

req.getRequestDispatcher("test.jsp").forward(req, resp);

3.異常處理

對於Web開發中如果出現錯誤,出於安全的考慮,我們並不希望將錯誤信息直接暴露到客戶端,我們可以定義統一的異常處理Servlet或者錯誤界面;

增加web.xml配置:

<!-- error-code 相關的錯誤頁面 -->
<error-page>
    <error-code>404</error-code>
    <location>/error.jsp</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <!-- 可以指定異常類型 -->
    <!-- <exception-type>java.lang.Throwable</exception-type > -->
    <location>/ExceptionHandle</location>
</error-page>
//ExceptionServlet.java

package com.aaron.servlet.test;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ExceptionServlet extends HttpServlet {
private String message;

@Override
public void init() throws ServletException {
        message = "Error String";
}

@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
        PrintWriter pw = resp.getWriter();
        pw.println("Ststus Code :"+req.getAttribute("javax.servlet.error.status_code"));
        pw.print("<p>");
        pw.print("From Servlet :"+req.getAttribute("javax.servlet.error.servlet_name"));
        pw.print("<p>");
        pw.println("Exception Type :"+req.getAttribute("javax.servlet.error.message"));
        pw.print("<p>");
        pw.flush();
    }

@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
        doGet(req,resp);
    }
}

4.文件上傳

以前文件上傳我們基本是使用common-fileupload或者SmartUpload,但是在Servlet 3.0之後,提供了文件上傳的API,使用Part代替FileItem,用於獲取上傳的文件,至於效率上,並沒有進行詳細的測試;

//使用@WebServlet配置UploadServlet的訪問路徑
@WebServlet(name="UploadServlet",urlPatterns="/UploadServlet")
//使用註解@MultipartConfig將一個Servlet標識爲支持文件上傳
@MultipartConfig
public class UploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String path=this.getServletContext().getRealPath("/");
        Part p=req.getPart("uploadFile");
        ApplicationPart ap= (ApplicationPart) p;
        String fname=ap.getSubmittedFileName();
        int name_idx=fname.lastIndexOf("\\")+1;
        String itemName=fname.substring(name_idx,fname.length());
        p.write(path+"/upload/"+itemName);
    }
}

Servlet 3.0提供了一些新特性,其中就包括可用註解代替在web.xml中的配置,包括Servlet、Filter、Listener;

Servlet 3.0還有一個重要的新特性是特強了對異步的支持,來應對複雜的業務邏輯,可同時配置異步的Servlet和異步的Listener用於監聽Servlet的創建和完成;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章