1. Servlet概述
?Servlet是Server Applet的簡稱,意思為用Java撰寫的服務器端的程式,它運行在web服務器中,web服務器負責Servlet和客戶的通信以及呼叫Servlet方法,Servlet和客戶通信采用“請求/回應”的模式,
?Servlet的作用:
? 1.接收用戶發送的請求
? 2.呼叫其他的java程式來處理請求
? 3.根據處理結果,服務器將回應回傳給客戶端

2. Servlet創建和使用
1.創建一個index.html,制作一個登錄表單
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--
Http協議:超文本傳輸協議
超鏈接,提交表單都是屬于http請求
一次請求中包含:請求頭`請求行`請求體(表單post提交資料)
-->
<form action="login" method="post">
賬號:<input type="text" name="account"><br>
密碼:<input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
2.在WEB_INF中創建lib包,存放jar包,添加jsp-api.jar和servlet-api.jar(地址https://mvnrepository.com)

3.匯入jar包



4.jar包匯入以后,選擇應用,OK
5.創建.java檔案,繼承HttpServlet,重寫父類方法
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import java.io.IOException;
public class LoginServlet_bank1 extends HttpServlet {
/*
* 在客戶端第一次訪問loginServlet時創建,服務器啟動時創建
* 只被呼叫一次,只創建一個servlet物件 單實體的
* 在創建servlet時,應由servlet容器完成,創建實體應在init()之前
* */
public LoginServlet_bank1() {
System.out.println("LoginServlet無參構造方法");
}
/*
* 提供服務器
* 每次請求都會呼叫service
* */
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("service");
}
/*
* 初始化,在創建物件后,構造方法執行后,呼叫init方法,完成一些初始化操作
* 只執行一次
* 如果沒有初始化操作可以不用重寫init()方法,服務器會呼叫init(),呼叫父類中的方法
* */
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println(config.getInitParameter("count"));
System.out.println("init");
}
/*
在服務器關閉前,servlet銷毀之前呼叫
可以在此方法中完成一些最終操作,比如保存日志
如果沒有最終操作,可以不用重寫,但會呼叫父類中的destory方法
*/
@Override
public void destroy() {
System.out.println("destroy");
}
}
6.在WEB-INF中web.xml進行配置
web.xml:用于存盤Web專案配置資訊,在服務器啟動時,由服務器讀取
xml可擴展標展標記語言,主要用于存盤資料
<!-- 配置servlet-->
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.ff.firstWeb.serverlet.LoginServlet</servlet-class>
<!--配置初始化引數-->
<init-param>
<param-name>count</param-name>
<param-value>111111</param-value>
</init-param>
<!-- 值<0,第一次訪問時創建. 值>=0,在服務器啟動時創建 -->
<load-on-startup>0</load-on-startup>
</servlet>
<!--
給servlet配置一個訪問地址,映射
反射機制可以根據類的地址動態創建物件
-->
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
7.啟動,即可向服務器發送請求
3.Servlet的生命周期

4.Http協議
什么是HTTP?
超文本傳輸協議 (HyperText Transfer Protocol)服務器傳輸超文本到本地瀏覽器的傳送協議,是互聯網上應用最為流行的一種網路協議,用于定義客戶端瀏覽器和服務器之間交換資料的程序,
HTTP是一個基于TCP/IP通信協議來傳遞資料.
HTTP是一個屬于應用層的協議,由于其簡捷、快速的方式,適用于分布式超媒體資訊系統.
5.Http請求
目前將http請求分為:
1.get:主要從古武器獲取資料,也可以向服務器發送資料,資料在地址中傳遞,會在地址欄中顯示
超鏈接
在瀏覽器地址欄中直接輸入地址訪問
js
window.open(url)
location.assign(url)
location.replace(url)
表單:method="get"
2.post:向服務器發送資料,提交資料在請求體發送,長度沒有限制,資料在請求中相對安全
表單:method="post"
get和post的區別
get:主要用于從服務器獲取資料
也可以向服務器發送資料,資料在地址中傳輸,會在地址欄中顯示
長度有限制
相對不安全
post:主要用于向服務器發送資料
提交資料在請求體中發送,長度沒有限制
資料在請求體中相對安全
HttpServletRequest是ServletRequest的子介面
HttpServletRequest比ServletRequest多了一些針對于Http協議的方法,
請求和回應是Web互動最基本的模式,在Servlet中,用HttpServletRequest來表示請求,
HttpServletRequest :封裝了請求的資訊,可以從中獲取任何請求資訊,
獲取客戶端/服務器資訊
getMethod()//得到客戶機請求方式
getScheme()//請求協議
getRemoteAddr()//回傳發出請求的客戶機的IP地址
getServerName()//服務器名(ip或域名)
getServerPort()//服務器埠
getParameter(name) //--- String 通過name獲得值
getParameterValues //--- String[ ] 通過name獲得多值
package com.ff.firstWeb.serverlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Enumeration;
public class LoginServlet_bank2 extends HttpServlet {
/*
無參構造方法默認存在
init()可以不用重寫,會呼叫父類的方法
servlet可以呼叫父類的
get請求--doGet()
post請求--doPost()
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
String name = req.getParameter("name");
String age = req.getParameter("age");
System.out.println(name+"::"+age);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
System.out.println("doPost");
String acount = req.getParameter("acount");
String password = req.getParameter("password");
String sex = req.getParameter("sex");
String work = req.getParameter("work");
String[] course = req.getParameterValues("course");
System.out.println(acount+"::"+password+"::"+sex+"::"+work+"::"+ Arrays.toString(course));
//請求接收中的資料(請求行,請求頭)
/*System.out.println(req.getMethod());
System.out.println(req.getRemoteAddr());
System.out.println(req.getServerName());
System.out.println(req.getServerPort());
System.out.println(req.getScheme());
System.out.println(req.getProtocol());
System.out.println(req.getContentType());
System.out.println(req.getContextPath());
System.out.println(req.getHeader("User-Agent"));
Enumeration<String> headerNames = req.getHeaderNames();
while (headerNames.hasMoreElements()){
String name = headerNames.nextElement();
System.out.println(name+":"+req.getHeader("name"));
}*/
//向客戶端做出相應,本質使用IO字符輸出流
PrintWriter out = resp.getWriter();
}
}
6.Http回應
一個http回應代表服務器向客戶端回送的資料,它包括:回應行,回應頭,回應體,
回應行里包含了http協議版本,以及用于描述服務器對請求的處理結果,
HTTP/1.1 (協議版本) 200(狀態嗎) OK(狀態碼描述)
狀態碼:服務器和瀏覽器用于確定狀態的固定數字號碼
? 200:請求成功
? 302:請求重定向
? 400:語意有誤,當前請求無法被服務器理解或請求引數有誤
? 404:請求資源不存在,通常是路徑寫錯了或者服務器資源洗掉了
? 500:服務內部錯誤(代碼例外)
回應頭用于描述服務器的基本資訊,以及資料描述
Server Apache-Coyote/1.1
Content-Type text/html;charset=UTF-8
Content-Length 0
Date Wed, 13 Sep 2017 02:26:07 GMT
回應體代表服務器向客戶端瀏覽器回送的正文
package com.ff.firstWeb.serverlet;
import com.ff.firstWeb.dao.checkDao;
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;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Date;
public class LoginServlet extends HttpServlet {
/*
無參構造方法默認存在
init()可以不用重寫,會呼叫父類的方法
servlet可以呼叫父類
get請求--doGet()
post請求--doPost()
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String account = req.getParameter("account");
String password = req.getParameter("password");
//設定回應內容的編碼格式
resp.setHeader("content-type","text/html;charset=utf-8");
//向客戶端做出相應,本質使用IO字符輸出流
PrintWriter out = resp.getWriter();
Connection connection = null;
try {
if (checkDao.link(account, password)) {
int x = 10/0;
String ip = req.getRemoteAddr();
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String login_time = dateFormat.format(date);
checkDao.insert(account,ip,login_time);
out.print("登陸成功");
} else {
out.print("密碼或賬戶錯誤");
}
} catch (Exception throwables) {
throwables.printStackTrace();
resp.sendRedirect("505.jsp");
}
}
}
8.jsp的引入(解決復雜動態頁面的回應)
package com.ff.firstWeb.serverlet;
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 LoginServlet_bank3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
System.out.println("doPost");
String acount = req.getParameter("acount");
String password = req.getParameter("password");
System.out.println(acount+"::"+password);
//設定回應內容的編碼格式
resp.setHeader("content-type","text/html;charset=utf-8");
//向客戶端做出相應,本質使用IO字符輸出流
PrintWriter out = resp.getWriter();
if (acount.equals("admin") && password.equals("111")){
//早期的動態頁面就是從servlet中輸出的
out.print("登陸成功");
out.print("<Html>");
out.print("<head>");
out.print("</head>");
out.print("<body>");
for (int i = 0; i < 10; i++) {
out.print("<h1>"+i+"</h1>");
}
out.print("</body>");
out.print("</Html>");
//問題:回應的頁面十分復雜
//解決方法:使用jsp的動態頁面,本質也是servlet,作用是向客戶端回應內容
}else{
out.print("賬號或密碼失敗");
}
}
}
在jsp中書寫java代碼需要<%%>包含起來
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<% for (int i = 0; i < 10; i++) {%>
<h1>動態資訊<%System.out.println(i)%></h1>
<%
}
%>
</body>
</html>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/283046.html
標籤:其他
