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程序,請求,響應 , 前端,瀏覽器。