JavaWeb知識學習——Servlet知識整理

一:Servlet容器

Servlet容器:運行Servlet、JSP、Filter等的軟件環境
可以用來創建Servlet,並調用Servlet的相關聲明週期的方法
Servlet生命週期的方法:Servlet容器負責調用
一:構造器 只被調用一次只有第一次請求Servlet時創建Servlet的實例,調用構造器。單實例
二:init只被調用一次在創建好實例後立即被調用,用於初始化當前的Servlet
三:service被多次調用每次請求都會調用service方法實際用於響應請求的
四:destroy只被調用一次,在當前Servlet所在的web應用被卸載前調用,用於
釋放當前Servlet所佔用的資源。
load-on-startup1/load-on-startup:可以指定Servlet被創建的實際若爲負數,則在第一次
請求時被創建若爲0或正數,則在當前WEB應用被Servlet容器加載時創建實例,且數組越小,越早被創建。
servlet-mapping:servlet映射
ServletContext該對象代表web應用可從中獲取到當前web應用的各個方面的信息。
代碼示例:

public class HelloServlet implements Servlet {
    public HelloServlet(){
        System.out.println("constructor.........");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init.........");
        String user = servletConfig.getInitParameter("user");
        System.out.println(user);
        Enumeration<String> names=servletConfig.getInitParameterNames();
        while (names.hasMoreElements()){
            String name=names.nextElement();
            System.out.println(name);
        }
        //獲取servlet名
        String servletName=servletConfig.getServletName();
        System.out.println(servletName);
        //獲取ServletContext對象
        ServletContext servletContext=servletConfig.getServletContext();
        String driver=servletContext.getInitParameter("driver");
        System.out.println("driver: "+driver);
        Enumeration<String> names1=servletContext.getInitParameterNames();
        while (names1.hasMoreElements()){
            String name=names.nextElement();
            String value=servletContext.getInitParameter(name);
            System.out.println(name+"\t"+value);
        }
        //獲取當前web應用上一個文件在服務器上的絕對路徑
        String realPath=servletContext.getRealPath("/note.txt");
        System.out.println(realPath);
        //獲取當前web應用的名稱
        String contextPath=servletContext.getContextPath();
        System.out.println(contextPath);
        //獲取某個文件的輸入流
        //方式一
        InputStream inputStream=
                servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
        //方式二
        ClassLoader classLoader=getClass().getClassLoader();
        InputStream inputStream1=classLoader.getResourceAsStream("jdbc.properties");
    }

    @Override
    public ServletConfig getServletConfig() {
        System.out.println("getServletConfig");
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service.........");
    }

    @Override
    public String getServletInfo() {
        System.out.println("getServletInfo");
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("destroy...");
    }
}

在servlet中獲取請求信息
Servlet的service方法用於應答請求,因爲每次請求都會調用service()方法
service方法中的參數:
servletRequest:封裝了請求信息,可以從中獲取到任何的請求信息
獲取請求參數
servletResponse:封裝了相應信息,可給用戶給與響應。
代碼示例:

public class LoginServlet implements Servlet {
    private ServletConfig servletConfig;
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig=servletConfig;
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service 請求。。。");
        String user=servletRequest.getParameter("user");
        String password=servletRequest.getParameter("password");
        System.out.println("User:\t "+user+"Password: \t"+password);
        //獲取多個值返回字符串對應的字符串數組
        String[] habits=servletRequest.getParameterValues("habits");
        for(String strings:habits){
            System.out.println(strings+"\t");
        }
        //獲取Enumeration
        Enumeration<String> names=servletRequest.getParameterNames();
        while(names.hasMoreElements()){
            String name=names.nextElement();
            System.out.println(name);
        }
        //獲取Map
        Map<String,String[]> map=servletRequest.getParameterMap();
        for(Map.Entry<String ,String[]> entry:map.entrySet()){
            System.out.println(entry.getKey()+":\t"+entry.getValue());
        }
        //獲取請求的URI
        HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
        String uri=httpServletRequest.getRequestURI();
        //獲取請求方式
        String method = httpServletRequest.getMethod();
        System.out.println(method);
        //servletResponse對象
        PrintWriter writer = servletResponse.getWriter();
        writer.println("HelloRoot");
        //設置響應的內容類型
        servletResponse.setContentType("application/msword");//響應爲word
        /*
        * 比對user和password是否和web.xm l中的一致
        * */
        ServletContext servletContext=servletConfig.getServletContext();
        String user1 = servletContext.getInitParameter("user");
        String password1 = servletContext.getInitParameter("password");
        //進行比對並響應
        if(user1.equals(user) && password1.equals(password)){
            writer.println("Hi: \t"+ user);
        }else{
            writer.println("sorry:\t"+user);
        }
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {

    }
}

login.html代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
<form action="loginServlet" method="post">
    user:<input type="text" name="user"/>
    password:<input type="password" name="password"/>
    <hr>
    <input type="checkbox" name="habits" value="swimming"/>Swimming
    <input type="checkbox" name="habits" value="HangOut"/>HangOut
    <input type="checkbox" name="habits" value="Gaming"/>Gaming
    <input type="checkbox" name="habits" value="KongFu"/>KongFu
    <input type="checkbox" name="habits" value="BasketBall"/>BasketBall
    <input type="submit"value="submit"/>
</form>
</body>
</html>

二.自定義GenericServlet

可以讓servlet繼承使用可以不用實現Servlet接口
GenericServlet:是一個Servlet接口和ServletConfig接口的實現類是一個抽象類,其中的
service方式是一個抽象方法。
新建的Servlet程序直接繼承GenericServlet可使得開發簡潔
具體實現步驟:在GenericServlet中聲明瞭一個ServletConfig類型的成員變量,在init(ServletConfig)方法中對其進行了初始化。
利用servletConfig成員變量的方法實現了ServletConfig接口的方法
還定義了一個init()方法在init(ServletConfig)方法中對其進行調用,子類可以直接調用init方法在其中實現對Servlet的初始化。
代碼示例:

public class MyGenericServlet implements Servlet,ServletConfig {
private  ServletConfig servletConfig;
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
 this.servletConfig=servletConfig;
    }
    @Override
    public ServletConfig  getServletConfig() {
        return servletConfig;
    }
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }

    //ServletConfig對象
    @Override
    public String getServletName() {
        return servletConfig.getServletName();
    }

    @Override
    public ServletContext getServletContext() {
        return servletConfig.getServletContext();
    }

    @Override
    public String getInitParameter(String s) {
        return servletConfig.getInitParameter(s);
    }

    @Override
    public Enumeration<String> getInitParameterNames() {
        return servletConfig.getInitParameterNames();
    }
}

HttpServlet:是一個繼承與GenericServlet的servlet針對於HTTP協議所定製
在實際開發中直接繼承與HttpServlet並根據請求的方式複寫doXX()方法
在servlet中獲取請求信息
Servlet的service方法用於應答請求,因爲每次請求都會調用service()方法
service方法中的參數:
servletRequest:封裝了請求信息,可以從中獲取到任何的請求信息獲取請求參數
servletResponse:封裝了相應信息,可給用戶給與響應。

public class MyHttpServlet extends MyGenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        super.service(servletRequest, servletResponse);
        if(servletRequest instanceof HttpServletRequest){
            HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
            if(servletResponse instanceof HttpServletResponse){
                HttpServletResponse httpServletResponse=(HttpServletResponse)servletResponse;
                service(httpServletRequest,httpServletResponse);
            }
        }
    }
    public void service(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse)throws ServletException, IOException{
        //獲取請求方式
        String method=httpServletRequest.getMethod();
        //根據調用方式使用相應的方式
        if("GET".equalsIgnoreCase(method)){
            doGet(httpServletRequest,httpServletResponse);
        }
        if("POST".equalsIgnoreCase(method)){
            doPost(httpServletRequest,httpServletResponse);
        }
    }
    public void doPost(HttpServletRequest httpServletRequest,
                       HttpServletResponse httpServletResponse)throws ServletException, IOException {
    }
    public void doGet(HttpServletRequest httpServletRequest,
                      HttpServletResponse httpServletResponse)throws ServletException, IOException {
    }
}

public class LoginServlet2 extends HttpServlet {
    private static final  long serialVersionUID=3125435L;
    public void doPost(HttpServletRequest httpServletRequest,
                       HttpServletResponse httpServletResponse) throws IOException {
        //獲取請求方式
        String method = httpServletRequest.getMethod();
        //獲取請求參數
        String user=httpServletRequest.getParameter("user");
        String password=httpServletRequest.getParameter("password");
        //獲取初始化參數
        String user1 = getServletContext().getInitParameter("user");
        String password1 = getServletContext().getInitParameter("password");
        PrintWriter writer = httpServletResponse.getWriter();
        //進行比對並響應
        if(user1.equals(user) && password1.equals(password)){
            writer.println("Hi: \t"+ user);
        }else{
            writer.println("sorry:\t"+user);
        }

    }
    public void doGet(HttpServletRequest httpServletRequest,
                      HttpServletResponse httpServletResponse) {
    }
}
public class LoginServlet3 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String user=req.getParameter("user");
        String password=req.getParameter("password");
        String sql="select count(id) from user where name = ? and pwd= ?";
        //獲取數據庫連接
        Connection connection=null;
        PreparedStatement preparedStatement=null;
        ResultSet resultSet=null;
        PrintWriter out=resp.getWriter();
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String Url="jdbc:mysql:///test";
            String use="root";
            String pass="123456";
            connection=DriverManager.getConnection(Url,use,pass);
            preparedStatement =connection.prepareStatement(sql);
            preparedStatement.setString(1,user);
            preparedStatement.setString(2,password);
            //
            resultSet=preparedStatement.executeQuery();
            if(resultSet.next()){
                int count=resultSet.getInt(1);
                if(count>0){
                    out.print("hello:"+user);
                }else{
                    out.print("sorry"+user);
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(resultSet!=null){
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(preparedStatement!=null){
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

以上代碼中的web.xml配置信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<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_4_0.xsd"
         version="4.0">
    <!--配置當前web應用的初始化參數-->
    <context-param>
        <param-name>driver</param-name>
        <param-value>com.mysql.jdbc.Driver</param-value>
    </context-param>
    <context-param>
        <param-name>jdbcUrl</param-name>
        <param-value>jdbc:mysql:///test</param-value>
    </context-param>
    <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>helloServlet</servlet-name>
        <!--Servlet的全類名-->
        <servlet-class>cn.javaweb.com.HelloServlet</servlet-class>
        <init-param>
            <!--參數名-->
            <param-name>user</param-name>
            <!--參數值-->
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>Sky</param-name>
            <param-value>123456</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <!--需要和某一個servlet節點的servlet-name子節點的文本節點一致-->
        <servlet-name>helloServlet</servlet-name>
        <!--映射具體的訪問路徑:/代表當前WEB應用的根目錄-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>cn.javaweb.com.LoginServlet3</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/loginServlet</url-pattern>
    </servlet-mapping>
</web-app>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章