1. 程式人生 > >servlet web應用基礎(2)

servlet web應用基礎(2)

目錄

Servlet寫helloworld

servlet流程圖

Myeclipse建立web專案

servlet執行緒安全

Servlet解決單執行緒的方式 實現介面SingleThreadModel

 servletconfig物件

servletcontext物件


Servlet寫helloworld

 

編寫第一個專案

在webapps 建立test專案

 WEB-INF/classes

FirstServlet.java

package cn.cast;



import java.io.*;

import javax.servlet.*;

public class FirstServlet extends GenericServlet{

public void service(ServletRequest req,ServletResponse res)throws ServletException,IOException{

OutputStream out = res.getOutputStream();

out.write("hello servlet".getBytes());

}

}

編譯 javac –d . FirstServlet.java  報錯  將tomcat 下面的servlet包加入系統環境變數  D:\tomcat-8.0.35\apache-tomcat-8.0.35\lib\servlet-api.jar 加入classpath

重新執行編譯成功

在WEB-INF下web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee

                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

  version="3.1">



    <servlet>

        <servlet-name>FirstServlet</servlet-name>

        <servlet-class>cn. cast.FirstServlet</servlet-class>

       

    </servlet>



    <servlet-mapping>

        <servlet-name>FirstServlet</servlet-name>

        <url-pattern>/FirstServlet</url-pattern>

    </servlet-mapping>

</web-app>

重啟伺服器 訪問:http://localhost:8080/test/FirstServlet   出現hello servlet

servlet流程圖

 

 

Myeclipse建立web專案

 

 

選擇no 使用java225.0  然後使用6.0的編譯器:

將需要的jar包放到lib目錄並且匯入:

 

建立servlet  繼承GenericServlet


 

package cn.cast;



import java.io.IOException;



import javax.servlet.GenericServlet;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;



public class ServletDemo extends GenericServlet {



    @Override

    public void service(ServletRequest req, ServletResponse res)

            throws ServletException, IOException {

        res.getOutputStream().write("hello servlet!!!!!!!!!".getBytes());

       

    }





}

在web.xml中配置對外訪問路徑:

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5"

    xmlns="http://java.sun.com/xml/ns/javaee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

   

   

    <servlet>

    <servlet-name>servletdemo1</servlet-name>

    <servlet-class>cn.cast.ServletDemo</servlet-class>

    </servlet>

  <servlet>

    <servlet-name>ServletDemo2</servlet-name>

    <servlet-class>cn.cast.ServletDemo2</servlet-class>

  </servlet>



   

    <servlet-mapping>

    <servlet-name>servletdemo1</servlet-name>

    <url-pattern>/servletdemo1</url-pattern>

    </servlet-mapping>

  <servlet-mapping>

    <servlet-name>ServletDemo2</servlet-name>

    <url-pattern>/servlet/ServletDemo2</url-pattern>

  </servlet-mapping>

   

  <display-name></display-name>

  <welcome-file-list>

    <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>

</web-app>

釋出專案

整合tomcat

Windows ---preferences---myeclipse----servers ----tomcat

選擇tomcat版本並選擇路徑  設定為enabled 啟用  (tomcat可設定jdk的版本號 預設不修改  啟動模式為debug模式)

 

將專案釋出到伺服器  並啟動tomcat 

 

訪問

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

官方文件:

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html

 

httpservlet

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html

 

新建一個servlet myeclispse 可之間建立並且在web.xml中配置訪問路徑
 

package cn.cast;

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;



public class ServletDemo2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        response.getOutputStream().write("hello httpservlet!!!".getBytes());

       

    }



    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        doGet(request, response);//不管是post還是get方法都由doGet方法處理。

    }



}

重啟tomcat

訪問:http://localhost:8080/web1/ServletDemo2

 

@@@@@@@@@@@@@@@@@@@@@@

 

 

伺服器自動載入web.xml 更改了web.xml檔案中的內容時候,不需要重啟服務。

 

 

 

驗證伺服器智慧建立一次servlet 

新建servletDemo3

package cn.cast;



import java.io.IOException;

import java.io.PrintWriter;



import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



public class ServletDemo3 extends HttpServlet {





    @Override

    public void destroy() {

        // TODO Auto-generated method stub

        super.destroy();

        System.out.println("destroy!");

    }



    @Override

    public void init(ServletConfig config) throws ServletException {

        // TODO Auto-generated method stub

        super.init(config);

        System.out.println("init");

    }



    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {



    }



    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        doGet(request, response);



    }



}

 

 

在瀏覽器訪問http://localhost:8080/web1/servlet/ServletDemo3

在控制檯顯示init  多次訪問也只顯示一次。

 

 

 

預設的servlet預設不配置,

servlet執行緒安全

 

Servlet如果操作了共享資源,需要注意執行緒安全的問題。

package cn.cast;



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;



public class ServletDemo4 extends HttpServlet {



    /**

    執行緒安全

     */

   

    //放在外面執行緒不安全。

    int i=0;

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        //變數放在裡面執行緒是安全的

        //int i=0;

       

        //在實際web資源訪問中是不可行的,同事只能有一個連線訪問,其他的連線等待。

        synchronized (this) {

            i++;

            try {

                Thread.sleep(1000*10);

            } catch (InterruptedException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

           

            response.getOutputStream().write((i+"").getBytes());

        }

       





    }





    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        doGet(request, response);

    }



}

 

Servlet解決單執行緒的方式 實現介面SingleThreadModel

方法是當一個請求沒有訪問沒有完畢後,建立一個新的servlet來響應新的請求。

package cn.cast;



import java.io.IOException;

import java.io.PrintWriter;



import javax.servlet.ServletException;

import javax.servlet.SingleThreadModel;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



public class ServletDemo4 extends HttpServlet implements SingleThreadModel{

    int i=0;

    //子類在覆蓋父類的方法時,不能丟擲比父類更多的異常。

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        i++;

        try {

            Thread.sleep(1000*4);

        } catch (InterruptedException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        response.getOutputStream().write((i+"").getBytes());

    }



    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        doGet(request, response);

    }



}



 servletconfig物件

Servletconfig用於封裝servlet的配置資訊,應用場景  :

在配置資料庫連線 字符集等  配置檔案等,不適合在程式中寫死方便切換的資料。

Web.xml

  <servlet>

    <servlet-name>ServletDemo5</servlet-name>

    <servlet-class>cn.cast.ServletDemo5</servlet-class>

   

    <init-param>

    <param-name>data</param-name>

    <param-value>xxx</param-value>

    </init-param>

    <init-param>

    <param-name>data2</param-name>

    <param-value>yyy</param-value>

    </init-param>

    <init-param>

    <param-name>data3</param-name>

    <param-value>zzz</param-value>

    </init-param>

  </servlet>

  <servlet-mapping>

    <servlet-name>ServletDemo5</servlet-name>

    <url-pattern>/servlet/ServletDemo5</url-pattern>

  </servlet-mapping>Servlet物件
package cn.cast;



import java.io.IOException;

import java.io.PrintWriter;

import java.util.Enumeration;



import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



public class ServletDemo5 extends HttpServlet {



    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

       

        ServletConfig config = this.getServletConfig();

       

        //得到指定的 引數

        String value = config.getInitParameter("data");

        System.out.println(value);

       

        //得到所有的引數 

        Enumeration e = config.getInitParameterNames();

        while (e.hasMoreElements()){

            String name = (String) e.nextElement();

            String value1 = config.getInitParameter(name);

            System.out.println(value1);

        }

    }



    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        doGet(request, response);

    }



}



訪問在控制檯輸出 xxx

 

servletcontext物件

 

ServletDemo6  存入資料

package cn.cast;



import java.io.IOException;

import java.io.PrintWriter;



import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;





//servletcontext例項

public class ServletDemo6 extends HttpServlet {

   

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        //得到servletcontext方式一

        ServletContext context = this.getServletConfig().getServletContext();

        //得到servletcontext方式二

        context = this.getServletContext();

       

        context.setAttribute("data", "xxx");

   

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {



        doGet(request, response);

    }



}

ServletDemo6  讀取資料

package cn.cast;



import java.io.IOException;

import java.io.PrintWriter;



import javax.servlet.ServletConfig;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



public class ServletDemo5 extends HttpServlet {



    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

       

        /*ServletConfig config = this.getServletConfig();

        String value = config.getInitParameter("data");

        System.out.println(value);*/

        ServletContext context = this.getServletContext();

        String value = (String) context.getAttribute("data");

        System.out.println(value);

       

    }



    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        doGet(request, response);

    }



}

 

 

應用場景:多個servlet專案之間實現資料共享。可以應用在聊天室。

Servletcontext

  1. 這是一個容器
  2. Servletcontext域說明了這個容器範圍,也就是應用程式範圍。