Servlet的學習和理解(二)

一.ServletContext接口html


 

Servlet引擎爲每一個WEB應用程序都建立一個對應的ServletContext對象,ServletContext對象被包含在ServletConfig對象中,調用ServletConfig.getServletContext方法能夠返回ServletContext對象的應用。
因爲每個WEB應用程序中的全部Servlet都共享同一個ServletContext對象,因此,SevletContext對象被稱爲application對象(WEB應用程序對象)。java


功能:mysql

        1.獲取web應用程序的初始化參數
        2.記錄日誌
        3.appliciation域範圍的屬性
        4.訪問資源文件
        5.獲取虛擬路徑所映射的本地路徑
        6.web應用程序之間的訪問
        7.ServletContext的其餘方法
web


ServletContext:
1).能夠由ServletConfig獲取
2).該對象表明當前web應用:能夠認爲ServletContext是當前WEB應用的一個大管家,能夠從中獲取當前web應用的各個方面的信息。
sql

2.1獲取當前web應用的初始化參數:能夠爲全部的Servlet所獲取,而Servlet的初始化參數只能用那個Servlet能夠獲取數據庫

 

1 <context-param>
2      <param-name>driver</param-name>
3      <param-value>com.mysql.jdbc.Driver</param-value>
4      </context-param>
5      

 

 

 

 


 

方法:
getInitParameter
getinitParameterNames

數組

代碼:瀏覽器

 

ServletContext servletContext=servletConfig.getServletContext();
        
        String driver=servletConfig.getInitParameter("driver");
        System.out.println("driver"+driver);
        Enumeration<String> names2=servletContext.getInitParameterNames();
        while(names2.hasMoreElements()) {
            String name=names2.nextElement();
            System.out.println("-->"+name);
        }

 

 

 

2.2獲取當前WEb應用的某一個文件在服務器上的絕對路徑,而不是部署前的路徑
getRealPath(String path);

2.3獲取WEB應用的名稱;
getContextPath()
服務器

代碼:app

 

String contextPath=servletContext.getContextPath();
System.out.println(contextPath);

 

2.4獲取當前WEB應用的某一個文件對應的輸入流


getResourceAssStream(String path):path的/爲當前WEB應用的根目錄.

代碼:

 

Classloader classLoader=getClass.getClassLoader();
InputStream is2=servletContext.getResourceAssStream("jdbc.properties");
System.out.println("1."+is);("/WEB-INF/classes/jdbc.properties");

 

本身新建一個jdbc.properties
2.5和atttrubute相關的幾個方法


 

二.Http簡介

WEB瀏覽器與WEB服務器之間的一問一答的交互過程必須遵循必定的規則,這個規則就是HTTP協議

HTTP是hypertext transfer protocol(超文本傳輸協議)的簡寫,它是TCP/IP協議集中的一個應用層協議,用於定義web瀏覽器與WEB服務之間交換 數據的過程以及數據自己的格式。

HTTP協議的版本HTTP/1.0,HTTP/1.1,HTTP-NG



使用GET和POST方式傳遞參數

在URL地址後面能夠附加一些參數

舉例:http://www.it1315.org/servlet/ParamsServlet?param1=abc&param2=xyz



GET方式
舉例:GET/servlet/param1=abc&param2=xyz HTTP/1.1
特色:傳送的數據量是有限制的,通常限制在1kb如下

POST方式
舉例:POST/servlet/param1=abc&param2=xyz HTTP/1.1
Host:
Content-Type:appliciation/x-www-form-urlencoded
Context-Length:28

param1=abc&param2=xyz
特色:傳送的數據量要比GET方式傳送的數據量大得多



Get請求和Post請求:
1).使用GET方式傳遞參數:
1.1在瀏覽器地址中輸入某個URL地址或單擊網頁上的一個超連接時,瀏覽器發出的HTTP請求消息的方式爲GET
1.2若是網頁中的<form>表單元素中的method屬性被設置爲"GET",瀏覽器提交這個FORM表單時生成的HTTP請求消息的請求方式也爲GET.
1.3使用GET請求方式給WEB服務器傳遞參數的格式:
  http://www.atguigu.net/counter.jsp?name&password=123
1.4使用GET方式傳送數據量通常限制在1kb如下。


2).使用POST方式傳遞參數:
2.1 POST請求方式主要向WEB服務器端程序提交FORM表單中的數據:form表單中的method置爲POST
2.2 POST方式將各個表單字段元素及其數據做爲HTTP消息的實體內容發送給WEB服務器,傳送的數據量要比使用GET方式傳送的數據量大得多。
POST/counter.jsp HTTP/1.1
referer:http://localhost:8080/Register.html
content-type:application/x-www-form-urlencoded
host:localhost:8080
content-length:43

name=zhangsan&password=123      --請求體重傳遞參數。


三.如何在Servlet中獲取請求信息:


1).Servlet的service()方法用於應答請求:由於每次請求都會調用service()方法。

public void service(ServletRequest request,ServletResponse response)throws ServletException,IOEcxeption

ServletRequest:封裝了請求信息,能夠從中獲取到任何的請求信息
ServletResponse:封裝了響應信息,若是想給用戶什麼響應,具體可使用該接口的實現方法




2).這兩個接口的實現類都是服務器給與實現的,並在服務器調用service方法時傳入

ServletRequest:
2.1獲取請求參數;
>String getParameter(String name):根據請求參數的名字,返回參數值。
>Map getParameterNames():返回請求參數的鍵值對:參數名,value:參數值,String數組類型
Enumeration getParameternames():返回參數名對應的Enumeration對象,
相似於ServletConfig(或ServletContext)的getInitParameterNames(方法)。
>String[] get ParameterValues(String name):根據請求參數的名字,返回字符串數組。
若請求參數有多個值(例如checkbox),該方法只能獲取到第一個提交的值。

2.2獲取請求的URl:
HttpServletRequest httpServletRequest=(HttpServletRequest)request;
        String requestURI=httpServletRequest.getRequestURI();
        System.out.println(requestURI);
        
2.3獲取請求方式:

String Method=httpServletRequest.getMethod();
        System.out.println(Method);

2.4如果一個GET請求,獲取請求參數對應的那個字符串,就是?後面的那個字符串
String queryString=httpServletRequest.getQueryString();
        System.out.println(queryString);

2.5獲取請求的Servlet的映射路徑
String servletPath=httpServletRequest.getServletPath();
        System.out.println(servletPath);

2.6和attribute相關的幾個方法



3).HttpServletRequest:是ServletRequest的子接口,針對於HTTP請求所定義,裏面包含了大量獲取HTTP請求相關的方法。




4).
ServletResponse:封裝了響應信息,若是想給用戶什麼響應,具體可使用該接口的實現方法

4.1 getWriter():返回PrintWriter對象,調用該對象的print()方法,將print()中的參數直接打印到客戶的瀏覽器上。PrintWriter out=reponse.getWriter();
        out.println("hello world...");
4.2 設置響應的內容類型setContextType()
reponse.setContentType("application/msword");

4.3 void sendRedirect(String Location):請求的重定向。(此方法爲HttpServletReponse 中定義。)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
練習:在web.xml文件中設置兩個WEB應用的初始化參數,user,password.
定義一個login.html,裏面定義兩個請求字段:user,password
在建立一個LoginServlet,在其中獲取請求的user,password。比對其和web.xml文件中定義的請求參數是否一致,若一致,響應hello:xxx,若不一致,響應sorry:xxx  xxx爲user.


 目錄:

web.mxl

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        id="WebApp_ID" version="3.0">


        <servlet>
                <servlet-name>loginServlet</servlet-name>
                <servlet-class>com.yuyi.javaweb.loginServlet</servlet-class>
                <init-param>
                        <param-name>user</param-name>
                        <param-value>root</param-value>

                </init-param>

                <init-param>
                        <param-name>password</param-name>
                        <param-value>123</param-value>
                </init-param>
                <load-on-startup>3</load-on-startup>

        </servlet>

        <servlet-mapping>
                <servlet-name>loginServlet</servlet-name>
                <url-pattern>/loginServlet</url-pattern>
        </servlet-mapping>
</web-app>

 

login,html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登陸界面</title>
</head>
<body>
     <form action="loginServlet" method="post">
     user:<input type="text" name="user">
     password:<input type="password" name="password">
     
     <br><br>
     interesting:
     <input type="checkbox" name="interesting" value="reading"/>Reading
     <input type="checkbox" name="interesting" value="game"/>Game
     <input type="checkbox" name="interesting" value="shopping"/>Shopping
     <input type="checkbox" name="interesting" value="party"/>Party
     <input type="checkbox" name="interesting" value="sport"/>Sport
     <input type="checkbox" name="interesting" value="sing"/>Sing
     <input type="submit" value="Submit">
     </form>
</body>
</html>

 

loginServlet.java

package com.yuyi.javaweb;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.EnumMap;
import java.util.Enumeration;
import java.util.Map;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class loginServlet implements Servlet{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public ServletConfig getServletConfig() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String getServletInfo() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void init(ServletConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void service(ServletRequest request, ServletResponse reponse) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("請求來了!");
        System.out.println(reponse);
        
        String user=request.getParameter("user");
        String password=request.getParameter("password");
        System.out.println(user+","+password);
        
        String interesting=request.getParameter("interesting");
        System.out.println(interesting);
        
        String[] interestings=request.getParameterValues("interesting");
        for(String intertest:interestings) {
            System.out.println("interesting:"+intertest);
        }
        
        Enumeration<String> names=request.getParameterNames();
        while(names.hasMoreElements()) {
            String name=names.nextElement();
            String val=request.getParameter(name);
            System.out.println(val);
        }
        Map<String,String[]>map=request.getParameterMap();
        for(Map.Entry<String, String[]>entry:map.entrySet()) {
            System.out.println(entry.getKey()+":"+Arrays.asList(entry.getValue()));
        }
        
        HttpServletRequest httpServletRequest=(HttpServletRequest)request;
        String requestURI=httpServletRequest.getRequestURI();
        System.out.println(requestURI);
        
        String Method=httpServletRequest.getMethod();
        System.out.println(Method);
        
        String queryString=httpServletRequest.getQueryString();
        System.out.println(queryString);
        
        String servletPath=httpServletRequest.getServletPath();
        System.out.println(servletPath);
        
        reponse.setContentType("application/msword");
        
        PrintWriter out=reponse.getWriter();
        out.println("hello world...");
        
        
    }
      
}

 


四.GenericServlet(瞭解)


1).是一個Servlet.是Servlet接口和ServletConfig接口的實現類,可是一個抽象類,其中的service方法爲抽象方法
2).若是新建的Service程序直接繼承GenericsServlet會使開發更簡潔
3.1.在GenericServlet聲明瞭一個ServletConfig類型的成員變量,在init(ServletConfig)方法對其初始化
3.2利用servletConfig成員變量的方法實現了ServletConfig接口的方法
3.還定義了一個init(Config)方法,在init(ServletConfig)方法對其調用,子類能夠直接覆蓋init()在其中實現對Servlet的初始化
4.不建議直接覆蓋init(ServletConfig),由於若是忘記編寫super(ServletConfig),仍是用了ServletConfig接口的方法,則會出現空指針異常
3.5新建的init{}並不是Servlet的生命週期方法,而intit(ServletConfig)是生命週期相關的方法.


package com.yuyi.ServletTest;

import java.io.IOException;
import java.util.Enumeration;

/**
 * 自定義的一個Servlet接口實現類,讓任何開發Servlet繼承該類,以簡化開發
 */

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public abstract class MyGenericServlet implements Servlet,ServletConfig{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public ServletConfig getServletConfig() {
        // TODO Auto-generated method stub
        return ServletConfig;
    }

    @Override
    public String getServletInfo() {
        // TODO Auto-generated method stub
        return null;
    }
    
    private ServletConfig ServletConfig;
    @Override
    public void init(ServletConfig arg0) throws ServletException {
        this.ServletConfig=arg0;
    }

    @Override
    public abstract void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException ;
/** 如下方法爲ServletConfig接口的方法**/
    @Override
    public String getInitParameter(String arg0) {
        // TODO Auto-generated method stub
        return ServletConfig.getInitParameter(arg0);
    }

    @Override
    public Enumeration<String> getInitParameterNames() {
        // TODO Auto-generated method stub
        return ServletConfig.getInitParameterNames();
    }

    @Override
    public ServletContext getServletContext() {
        // TODO Auto-generated method stub
        return ServletConfig.getServletContext();
    }

    @Override
    public String getServletName() {
        // TODO Auto-generated method stub
        return ServletConfig.getServletName();
    }



}

 




2.HttpServlet:
1).是一個Servlet,繼承自Genericservlet.針對於Http協議所定製。
2).在service()方法中直接把ServletRequest和ServletReponse轉爲HttpRequest和HttpReponse
並調用了重載的service(HttpRequest,HttpReponse)
在service(HttpRequest,HttpReponse)獲取了請求方式:request.getMethod().
doxxx() 方法(xxx 爲具體的請求方式,好比doGet,doPost)


代碼:

public class MyHttpServletRequest extends MyGenericServlet{

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
        if(arg0 instanceof HttpServletRequest) {
            HttpServletRequest request=(HttpServletRequest)arg0;

            if(arg1 instanceof HttpServletResponse) {
                HttpServletResponse response=(HttpServletResponse)arg1;
                service(arg0, arg1);
            }
        }
    }
    public void service(HttpServletRequest request,HttpServletResponse reponse) throws ServletException,IOException{
        //1.獲取請求方式。
        String method=request.getMethod();
        //2.根據請求方法再調用對應的處理
方法
        if("GET".equalsIgnoreCase(method)) {
            doGet(request,reponse);
        }
        else if("POST".equalsIgnoreCase(method)) {
            doPost(request,reponse);
        }
    }
    private void doPost(HttpServletRequest request, HttpServletResponse reponse) {
        // TODO Auto-generated method stub
        
    }
    private void doGet(HttpServletRequest request, HttpServletResponse reponse) {
        // TODO Auto-generated method stub
        
    }
}

 

 


 

3).實際開發中,直接繼承httpServlet,並根據請求方式複寫doxxx()方法接口
4).好處:直接由針對的覆蓋doxxx方法;直接使用HttpServletrequest和Httpreponse,不須要強轉。


 

在MySQl數據庫建立一個test_users數據表,添加三個字段
定義一個login.html,裏面定義兩個請求字段:id,user,password.並錄入幾條記錄user,password
在建立一個LoginServlet(須要繼承自HttpServlet,並重寫doPost方法),在其中獲取請求的user,password。利用JDBC從test_user中查詢有沒有和頁面輸入的user,password對應的記錄,
SELECT count(id) FROM test_users WHERE user=?
如有,響應Hello:xxx,若不一致,響應sorry:xxx  xxx爲user.


 1.數據庫的話就本身創建

2.目錄

3.web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        id="WebApp_ID" version="3.0">
        <!-- 初始化參數 -->
        <context-param>
                <param-name>user</param-name>
                <param-value>root</param-value>
        </context-param>

        <context-param>
                <param-name>password</param-name>
                <param-value>123456</param-value>
        </context-param>
        
        <!-- 配置servlet -->
        <servlet>
        <servlet-name>loginServlet3</servlet-name>
        <servlet-class>  com.yuyi.ServletTest.loginServlet3</servlet-class>
        </servlet>
        <servlet-mapping>
        <servlet-name>loginServlet3</servlet-name>
        <url-pattern>/loginServlet3</url-pattern>
        </servlet-mapping>
</web-app>

 

 4.login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登陸界面</title>
</head>
<body>
        <form action="loginServlet3" method="post">
        user:<input type="text" name="username"/>
        password:<input type="password" name="password"/>
        <input type="submit" value="Submit"/>
        </form>
</body>
</html>

 

5.loginServlet3.java

package com.yuyi.ServletTest;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

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

import java.sql.Connection;
import java.sql.PreparedStatement;

public class loginServlet3 extends HttpServlet{
    @Override
    protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException {
        String username=request.getParameter("username");
        String password=request.getParameter("password");

        Connection connection=null;
        PreparedStatement statement=null;
        ResultSet resultSet=null;

        PrintWriter out=response.getWriter();
        String sql="SELECT  count(id)from users WHERE username=?"+"AND password=?";

        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url="jdbc:mysql://localhost:3306/test";
            String user="root";
            String password2="628081abc";
            connection=(Connection) DriverManager.getConnection(url,user,password2);

            statement=(PreparedStatement) connection.prepareStatement(sql);
            statement.setString(1, username);
            statement.setString(2, password);

            resultSet=statement.executeQuery();

            if(resultSet.next()) {
                int count=resultSet.getInt(1);

                if (count>0) {
                    out.println("Hello,"+username);
                }else {
                    out.println("sorry,"+username);
                }
            }

        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(resultSet!=null) {
                    resultSet.close();            
                }
            }catch(SQLException e){    
                e.printStackTrace();
            }

            try {
                if(statement!=null) {
                    statement.close();
                }
            } catch (SQLException e) {

            }
            
            try {
                if(connection!=null) {
                    connection.close();
                }
            } catch (SQLException e) {

            }
            
        }
    }
}
相關文章
相關標籤/搜索