Servlet

簡介

  • Servlet是SUN公司提供的一門用於動態網頁資源的技術;
  • SUN公司在其API中提供了一個Servlet接口,用戶若想要發一個動態的Web資源(即開發一個Java程序向瀏覽器輸送數據),須要完成如下兩個步驟;
  1. 編寫一個Java類,實現servlet接口;
  2. 把開發好點的Java類部署到web服務器中;

Servlet的運行過程

Servlet實現類

  1. Servlet接口是SUN 公司定義了兩個默認實現類,分別爲:GenericSrevlet、HttpServlet;
  2. HttpServlet指可以處理HTTP請求的Servlet,他在原有的Servlet接口上添加了一些HTTP協議處理辦法,他與Servlet接口的功能更增強大。所以開發人員在編寫Servlet時,一般是繼承這個類,而避免直接去實現Servlet接口;
  3. HttpServlet 在實現Servlet接口時,重寫了Service方法,該方法體內的代碼會自動判斷用戶的請求方式,如GEt請求,則是調用HTTPServlet的DoGet方法,如Post請求,則調用doPost方法。所以,開發人員在編寫Servlet時,一般只須要重寫DoGet和DoPost方法,而不須要重寫servlet方法;

使用IDE開發Servlet

  • 下載Servlet須要的jar包;

  • 在IEDA中建一個Web項目;
  • 新建Servlet,編寫代碼;
  • 配置web.xml中的Servlet映射的 servlet-mapping
<servlet>
        <servlet-name>Servlet1</servlet-name>  //類名
        <servlet-class>com.zhang.demo1.Servlet1</servlet-class>  //路徑
    </servlet>
    <servlet-mapping>
        <servlet-name>Servlet1</servlet-name>  //類名
        <url-pattern>/test01</url-pattern>
    </servlet-mapping>
  • 啓動Tomcat服務器;
  • 訪問Servlet網頁;

 ServletContext

  1. Web 容器在啓動時,他會爲每一個Web應用程序都建立一個對應的ServletContext對象,表明當前的應用;
  2. 多個Servlet經過ServletContext對象實現數據共享;
  3. 獲取Web應用的初始化參數;
  4. 用ServletContext實現請求轉發;
  5. 利用ServletContext對象讀取資源文件;

經過ServletContext對象讀取網站配置文件

步驟:

 1.新建一個properties文件html

driver=com.mysql.jdbc.Driver
username=root
password=123456
URL=jdbc:mysql://locahost:3306/smbms

2.編寫Servlet類前端

package com.zhang.demo;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class Servlet03 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String realPath = this.getServletContext().getRealPath("/WEB-INF/classes/resour/database.properties");
        System.out.println("獲取的真實路徑"+realPath);
        Properties properties = new Properties();
        FileInputStream is = new FileInputStream(realPath);
        properties.load(is);
        String driver = properties.getProperty("driver");
        String username = properties.getProperty("username");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");

        //網頁輸出
        response.getWriter().println(driver);
        response.getWriter().println(username);
        response.getWriter().println(password); 
        response.getWriter().println(url);
        
        //控制檯輸出
        System.out.println(driver);
        System.out.println(username);
        System.out.println(password);
        System.out.println(url);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
    }
}

3.配置web.xml文件java

<servlet>
        <servlet-name>Servlet03</servlet-name>
        <servlet-class>com.zhang.demo.Servlet03</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Servlet03</servlet-name>
        <url-pattern>/test3</url-pattern>
    </servlet-mapping>

4.查看訪問頁面;mysql

上述代碼編譯運行的結果以下圖所示:web

網頁輸出:sql

控制檯輸出:數據庫

 Servlet的Request

實例:

package com.zhang.demo;

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

public class RequestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //查看request對象的方式
        System.out.println(request.getContextPath()); //得到web項目路徑
        System.out.println(request.getRequestURI()); //請求的URL路徑
        //Remote 遠程
        System.out.println(request.getRemoteUser()); //得到遠程的用戶名
        System.out.println(request.getRequestedSessionId()); //得到SessionId;
        System.out.println(request.getServletPath()); //請求servlet的url
        System.out.println(request.getLocalAddr()); //得到本地地址  防火牆
        System.out.println(request.getLocalName()); //得到本地名字
        System.out.println(request.getLocalPort()); //得到訪問的端口號

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

配置web.xml代碼:

 <servlet>
        <servlet-name>RequestServlet</servlet-name>
        <servlet-class>com.zhang.demo.RequestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RequestServlet</servlet-name>
        <url-pattern>/RD</url-pattern>
    </servlet-mapping>

Request對象接收前端用戶提交的參數

1.編寫註冊頁面,表單提交的位置 action:服務項目的路徑/servlet對應的請求ur;例如: <form action="${pageContext.request.contextPath}/RD2" method="post"> 瀏覽器

<%--
  Created by IntelliJ IDEA.
  User: 張滄
  Date: 2019/7/16/016
  Time: 23:12
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>註冊</title>
</head>
<body>

<%--JSP的註釋--%>
<%--Form表單
    action:表明要提交的路徑,表單要提交到哪裏 ,能夠提交到一個Servlet
        //提交到Servlet須要,獲取到Web項目的路徑下的Servlet
    method: 提交表單的方式
--%>
<h1>註冊</h1>

<form action="${pageContext.request.contextPath}/RD2" method="post">

    <p>用戶名:<input type="text" name="username"></p>
    <p>密碼:<input type="password" name="password"></p>

    <p>
        <input type="submit">
        <input type="reset">
    </p>
</form>
</body>
</html>

2.寫處理前端提交信息的RequestServlet服務器

  • 接收前端傳遞的控件信息, request.getParameter(「控件的name‘);例如: String username = request.getParameter("username"); String password = request.getParameter("password"); app

 

package com.zhang.demo;

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

public class RequestServlet2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //經過HttpServletRequest獲取前端用戶提交的信息
        //req.getParameterValues(); 得到前端傳遞的控件信息,經過控件的name;可是能夠接受多個參數的控件,好比(多選框....)
        //req.getParameter(); 得到前端傳遞的控件信息,經過控件的name;

        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");

        String username = request.getParameter("username");
        String password = request.getParameter("password");

        //鏈接數據庫,比較數據庫中的信息是否匹配

        if (username.equals("admin")&&password.equals("1234567")){
            System.out.println("登陸成功!"); //跳轉到成功頁面
        }else {
            System.out.println("登陸失敗!"); //提示從新註冊
        }
        System.out.println(username);
        System.out.println(password);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

3.配置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">
    <servlet>
        <servlet-name>RequestServlet2</servlet-name>
        <servlet-class>com.zhang.demo.RequestServlet2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RequestServlet2</servlet-name>
        <url-pattern>/RD2</url-pattern>
    </servlet-mapping>
</web-app>

4.提交測試

提交以前的路徑

在提交後的路徑

以上代碼編譯運行的結果以下所示:

這是測試三種不一樣的結果;

 Request實現請求轉發

package com.zhang.demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RequestServlet3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");//處理亂碼
        //處理前端的請求
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        System.out.println("接收到的用戶名:"+username+"\n密碼:"+password+"\n愛好:");

        String[] hobbies = request.getParameterValues("hobby");

        for (String hobby : hobbies) {
            System.out.println(hobby);
        }

        //重定向:服務器告訴客戶端你應該請求另一個地址;  (地址欄會變)
        //resp.sendRedirect("url");

        //轉發:服務器把這個請求轉向另一個Servlet去處理; (地址欄不會變)
        //RequestDispatcher ,須要使用RequestDispatcher來進行處理,咱們須要得到這個類
        //參數就是他要轉發到的頁面

        /*
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/success.jsp");
        requestDispatcher.forward(req,resp);
        */

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        request.getRequestDispatcher("/success.jsp").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}
相關文章
相關標籤/搜索