Servlet學習總結

Servlet是sun公司提供的一門用於開發動態web資源的技術,咱們也把實現了servlet接口的java程序,稱之爲Servletphp

一、編寫一個Java類,實現servlet接口。html

package Servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 這也是一個頁面,一個特殊的頁面
 * 徹底使用Java編寫的頁面,甚至能夠認爲這是一個虛擬頁面
 * Request:來自瀏覽器的請求(輸入流)
 * Response:服務器給瀏覽器的響應(輸出流)
 * @author Don
 * @date:日期:2017年4月1日 時間:下午3:30:11*
 * @version 1.0
 */
public class ServletTest extends HttpServlet {
    /**
     * doGet方式主要來源url的跳轉
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("GET通道");
         /**
         * 當多線程併發訪問這個方法裏面的代碼時,會存在線程安全問題嗎
         * i變量被多個線程併發訪問,可是沒有線程安全問題,由於i是doGet方法裏面的局部變量,
         * 當有多個線程併發訪問doGet方法時,每個線程裏面都有本身的i變量,
         * 各個線程操做的都是本身的i變量,因此不存在線程安全問題
         * 多線程併發訪問某一個方法的時候,若是在方法內部定義了一些資源(變量,集合等)
         * 那麼每個線程都有這些東西,因此就不存在線程安全問題了
         */
        int i=1; //若定義爲全局變量則線程不安全
        i++;
        
        //若程序所需必須爲全局變量的時,定義全局變量後,用以下方式
        synchronized (this) {//在java中,每個對象都有一把鎖,這裏的this指的就是Servlet對象
            i++;
            try {
                Thread.sleep(1000*4);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            resp.getWriter().write(i+"");
        }
        
        //解決get亂碼的問題
        String str= req.getParameter("Name");
        byte[] bs = str.getBytes("ISO-8859-1");
        String name = new String(bs, "UTF-8");
    
        
        //告訴瀏覽器這是個什麼響應(解決瀏覽器展示爲練嗎)
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        out.print("<html>");
        out.print("<head>");
        out.print("<title>個人Servlet測試</title>");
        out.print("</head>");
        out.print("<body>這是我得第一個Java Servlet程序...</body>");
        out.print("</html>");
    }
    
    /**
     * doPost方式主要用來提交表單
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("POS通道");
        
        //POST解決亂碼
        resp.setCharacterEncoding("UTF-8");
    }
}

 

二、把開發好的Java類經過Web.xml部署到web服務器中。java

在web.xml中配置url訪問的Servlet,配置在<web-app></web-app>中web

<servlet>
      <servlet-name>Servelet</servlet-name>
      <servlet-class>Servlet.ServletTest</servlet-class>
  </servlet>
  <!-- 一個Servlet可映射多個URL地址 -->
  <servlet-mapping>
      <servlet-name>Servelet</servlet-name>
      <url-pattern>/hello/good.html</url-pattern>  
  </servlet-mapping>
  <servlet-mapping>
      <servlet-name>Servelet</servlet-name>
      <url-pattern>/hello/good.php</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
      <servlet-name>Servelet</servlet-name>
      <url-pattern>/hello/good.aspx</url-pattern>
  </servlet-mapping>
  
  <!-- 通用匹配符 *和/ /*-->
   <servlet-mapping>
      <servlet-name>Servelet</servlet-name>
      <url-pattern>*.do</url-pattern>
  </servlet-mapping>
   <servlet-mapping>
      <servlet-name>Servelet</servlet-name>
      <url-pattern>/action/*</url-pattern>
  </servlet-mapping>
  
  <!-- 缺省Servlet用於處理全部其餘Servlet都不處理的訪問請求 -->
   <servlet-mapping>
     <servlet-name>Servelet</servlet-name>
     <url-pattern>/</url-pattern>
   </servlet-mapping>

Servlet下實現的功能簡介數組

request    表明瀏覽器發往Java的請求,包含輸入流
response表明Java發往瀏覽器的響應,包含輸出流

request.getParameter 接一個參數
request.getParameterValues 接數組


GET傳漢字容易出現亂碼
POST傳漢字只須要設置req.setCharacterEncoding("UTF-8")便可

URL自己有字符集,火狐默認ISO-8859-1
//火狐GET方式傳漢字到Servlet
String str=req.getParameter("un");
byte[] bs = str.getBytes("ISO-8859-1");
String name = new String(bs, "UTF-8");
System.out.println(name);

重定向:
//獲取上下文路徑,也就是所謂的項目根,至關於WebRoot
String path = request.getContextPath();
//重定向:給瀏覽器一個新方向,去吧,重定向以後最好return
response.sendRedirect(path+"/index.jsp");
return;

請求轉發:
//請求轉發到B,屬於服務器內部轉發,瀏覽器是看不到的
//轉發器,路徑中的/表明了WebRoot
RequestDispatcher dis = request.getRequestDispatcher("/servlet/b");
dis.forward(request, response); //轉發

request的生命週期很短,當咱們看到頁面時它就已經死掉了。
request.setAttribute(name,object);能夠臨時存儲數據
相關文章
相關標籤/搜索