javaWeb之Servlet

Servlet介紹

  • Servlet是sun 公司提供的一門用於開發動態web資源的技術。
  • 用戶若想開發一個動態Web資源(即開發一個java程序想向瀏覽器去輸出數據),需要完成2個步驟:
    1.編寫一個java類,實現servlet接口
    2.把開發好的Java類部署到Web服務器中
  • 通常我們把實現了servlet接口的java程序稱之爲Servlet

Servlet運行過程

在這裏插入圖片描述

Servlet實現類

在這裏插入圖片描述

使用Idea開發Servlet

在這裏插入圖片描述

Servlet映射路徑問題

1.一般情況下我們都會指定一個URL , 一個URL對應一個請求
2.通配問題
/* :不報錯
*.do

轉發和重定向的區別 (面試常見題:筆試)

重定向:服務器告訴客戶端,你去請求另外一個地址;客戶端行爲

  • 地址欄會變
  • 不能攜帶參數

轉發:服務器自己轉發到服務器上的另一個請求; 服務器行爲

  • 地址欄不會變
  • 可以攜帶參數
    將這個請求,轉換到另一個地址;

ServletContext

在這裏插入圖片描述
圖示:
在這裏插入圖片描述
案例一:
src:

package com.kuang.servlet;

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 ServletTest01 extends HttpServlet {

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

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("我接受到你的請求了");
        }
        }

package com.kuang.servlet;

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

public class SetvletTest02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
        //告訴瀏覽器,我們響應的東西使用html解析;
        resp.setContentType("text/html");
        resp.setCharacterEncoding("UTF-8");
        //通過響應給客戶端返回一個字符串
        PrintWriter writer = resp.getWriter();
        writer.print("你好!");
        writer.print("<h1>Hello,Servlet!</h1>");
        */
        resp.sendRedirect("index.jsp");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Post");
    }

}

package com.kuang.servlet;

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 Failed extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("404.jsp");
        System.out.println("123123123");
    }
}

web下:404和index.jsp
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>ServletTest01</servlet-name>
        <servlet-class>com.kuang.servlet.ServletTest01</servlet-class>
    </servlet>

    <servlet>
        <servlet-name>Test02</servlet-name>
        <servlet-class>com.kuang.servlet.SetvletTest02</servlet-class>
    </servlet>

    <servlet>
        <servlet-name>404</servlet-name>
        <servlet-class>com.kuang.servlet.Failed</servlet-class>
    </servlet>




    <!--
        關於請求路徑問題:
        localhost:8080/項目名/請求的路徑
        localhost:8080/servlet01/
    -->
    <servlet-mapping>
        <servlet-name>ServletTest01</servlet-name>
        <url-pattern>/test01</url-pattern>
    </servlet-mapping>
    <!--
        /*
        /*.do
        /item/馬雲
   【注意】儘量在請求的URL中不要使用中文;
    -->

    <!--
        RestFul風格
        localhost:8080/項目名/第一級(第一個參數)/第二級(第二個參數)/...
        localhost:8080/項目名/hello?username=admin&password=123456
        localhost:8080/項目名/hello/admin/123456
    -->

    <servlet-mapping>
        <servlet-name>Test02</servlet-name>
        <url-pattern>/test02</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>404</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>


</web-app>

案例二:
src:

package com.kuang.servlet;

import javax.servlet.ServletContext;
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 ServletDemo01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //通過servlet對象可以獲取一個ServletContext;
        ServletContext context = this.getServletContext();

        String username = "小學生";//可以通過JDBC去讀取;
        //setAttribute :設置一個屬性;(屬性名,屬性值)
        context.setAttribute("name",username);
        response.setCharacterEncoding("utf-8");
        response.getWriter().print("設置name成功:"+username);
    }
}

package com.kuang.servlet;

import javax.servlet.ServletContext;
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 ServletDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        ServletContext context = this.getServletContext();
        String name = (String) context.getAttribute("name");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().print("我們獲取到的ServletDemo01信息爲:"+name);

    }
}

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>Demo01</servlet-name>
        <servlet-class>com.kuang.servlet.ServletDemo01</servlet-class>
    </servlet>

    <servlet>
        <servlet-name>Demo02</servlet-name>
        <servlet-class>com.kuang.servlet.ServletDemo02</servlet-class>
    </servlet>

    <!--=====================================================-->
    
    <servlet-mapping>
        <servlet-name>Demo01</servlet-name>
        <url-pattern>/q1</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>Demo02</servlet-name>
        <url-pattern>/q2</url-pattern>
    </servlet-mapping>

</web-app>

案例三:通過servletcontext讀取網站的配置信息
在這裏插入圖片描述
新建一個properties文件:

driver=com.mysql.jdbc.Driver
username=root
password=123456
url=jdbc:mysql://localhost:3306/smbms

編寫servlet類:

package com.kuang.servlet;

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;

//讀取properties配置文件
public class ServletDemo03 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //讀取配置文件

        //1.獲得配置文件的路徑
        String realPath = this.getServletContext().getRealPath("/WEB-INF/classes/resources/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");


        //響應到網頁
        resp.getWriter().println(driver);
        resp.getWriter().println(username);
        resp.getWriter().println(password);
        resp.getWriter().println(url);

        //=======================================
        System.out.println(driver);
        System.out.println(username);
        System.out.println(password);
        System.out.println(url);



    }
}

配置web.xml文件:

<servlet>
    <servlet-name>Demo03</servlet-name>
    <servlet-class>com.kuang.servlet.ServletDemo03</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Demo03</servlet-name>
    <url-pattern>/q3</url-pattern>
</servlet-mapping>

訪問查看:

localhost:8080/demo02/q3

亂碼問題解決方案:

  • 所有能設置編碼的地方都統一設置 : 數據庫,數據庫字段,Servlet程序,請求,響應 , 前端,瀏覽器。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章