servlet是用於開發動態web資源的技術;若是須要發一個動態web資源,須要編寫一個java類,並實現servlet接口,並把開發好的java類部署到web服務器中。通常狀況下,咱們把實現了servlet接口的java程序稱爲Servlet。Servlet接口有兩個默認的實現類,分別是GenericServlet和HTTPServlet。他們的關係能夠在HTTPServlet和GenericServlet的源碼中詳細學習。html
Tomcat做爲Web服務器之一,具備性能優良,很是的小(它是符合Web服務器最小的服務器)的特色。下載tomcat:http://tomcat.apache.org/——找到download——下載完成後,解壓到任意目錄。前端
Tomcat目錄結構:java
1. bin:春芳可執行文件、啓動和關閉; 2. conf:存放Tomcat的配置文件; 3. lib:存放服務器須要的jar包; 4. logs:日誌文件; 5. temp:臨時文件; 6. webapps:存放網站和web目錄; 7. work:Tomcat的工做目錄;
使用IDEA搭建Web開發環境:mysql
打開idea,並建立一個微博項目;web
配置Tomcat服務器sql
在Run/Debug Comfigurations中,找到Tomcat Server中的local;經過更更名字,修復警告,修改項目名稱等來完成搭建。數據庫
302:表示重定向;apache
404:表示請求的文件不存在,路徑寫錯等問題;瀏覽器
500:服務器代碼寫錯了,可能文件中的java代碼有誤。tomcat
idea開發Servlet須要準備而且導入Servlet須要的jar包。能夠經過如下操做進行自動下載jar包:
在IDEA中新建一個web項目,並新建一個package,在其中新建一個Servlet文件。此idea會自動生成一個實現了HttpServlet並重寫了doGet和doPost方法的java文件,但文件的Servlet字樣都是報紅出錯的。須要咱們利用idea的只能糾錯功能,就能夠很是快捷的導入jar包。也能夠手動將jar包導入項目的lib文件夾中。最終程序中的Servlet字樣不報紅,lib目錄下有jar包,就是導入成功。
簡單來講,就是將一個請求,轉換到另外一個地址。java中,語法以下:
response.sendRedirect("success.jsp");//重定向到成功頁面
新建一個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>Demo01</servlet-name> <servlet-class>com.David.servlet.ServletDemo01</servlet-class> </servlet> <servlet-mapping> <servlet-name>Demo01</servlet-name> <url-pattern>/d1</url-pattern> </servlet-mapping>
運行,訪問查看localhost:8080/demo02/q3
全部能設置編碼的地方都統一設置:數據庫,數據庫字段,Servlet程序,請求,響應 , 前端,瀏覽器。
request.setCharacterEncoding("UTF-8");//處理亂碼問題 response.setCharacterEncoding("UTF-8");//處理亂碼問題
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 RequestDemo01 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); } }
寫前端註冊頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>註冊</title> </head> <body> <%-- Form表單 action:表明要提交的路徑,表單要提交到哪裏 ,能夠提交到一個Servlet //提交到Servlet須要,獲取到Web項目的路徑下的Servlet method: 提交表單的方式 --%> <h1>註冊</h1> <form action="${pageContext.request.contextPath}/r2" 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>
寫處理前端提交信息的Servlet
package com.kuang.servlet; import javax.print.attribute.HashPrintRequestAttributeSet; 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 RequestDemo02 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 { //經過HttpServletRequest獲取前端用戶提交的信息 //req.getParameterValues(); 得到前端傳遞的控件信息,經過控件的name;可是能夠接受多個參數的控件,好比(多選框....) //req.getParameter(); 得到前端傳遞的控件信息,經過控件的name; req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); String username = req.getParameter("username"); String password = req.getParameter("password"); //鏈接數據庫,比較數據庫中的信息是否匹配 if (username.equals("David")&&password.equals("1234567")){ System.out.println("登陸成功!"); //跳轉到成功頁面 }else { System.out.println("登陸失敗!"); //提示從新註冊 } System.out.println(username); System.out.println(password); } }
配置web.xml
<servlet> <servlet-name>RequsetDemo02</servlet-name> <servlet-class>com.David.servlet.RequestDemo02</servlet-class> </servlet> <servlet-mapping> <servlet-name>RequsetDemo02</servlet-name> <url-pattern>/d2</url-pattern> </servlet-mapping>
提交測試
簡單說轉發是服務器本身轉發到服務器上的另外一個請求。
在Web中,會話表示從瀏覽器打開某個網站,在這個網站中不管操做了什麼,直到關閉瀏覽器,這一個過程,稱之爲一個會話。
會話結束的方式:
處理會話是由於:有時候要求,長期保持會話,不管用戶關閉少次瀏覽器,這個會話都要存在。
在客戶端留下一點東西,客戶端下次會呈現出來過來,服務器就知道客戶端以前訪問過。
package com.westos.serlvet; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class CookieTest extends HttpServlet { boolean flag = false; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //解決亂碼問題: request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); //檢查請求的人是否帶了Cookie //經過用戶的請求,檢查它是否有cookie Cookie[] cookies = request.getCookies(); System.out.println("cookie:"+cookies); if (flag){//若是flag是真,來過 if (cookies!=null){//你有cookie for (int i = 0; i < cookies.length ; i++) { Cookie cookie = cookies[i]; if (cookie.getName().equals("lastLoginTime")){ response.getWriter().println("你上一次來的時間爲:"+cookie.getValue()); System.out.println("刷新了cookie"); } } } }else { //若是flag是假,沒來過 response.getWriter().println("你是第一次來,還想享受組VIP待遇?"); System.out.println("給該用戶一個cookie"); } //創建一個cookie Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+""); //設置cookie保存的時間 //cookie.setMaxAge(); //把這個cookie發給客戶端 response.addCookie(cookie); //response.addCookie(new Cookie("lastLoginTime",System.currentTimeMillis()+"")); flag = true; } }
在服務器上作記錄,下次客戶端訪問的時候就能判斷出客戶端以前訪問過。
只要客戶端一旦鏈接上服務器,服務器就會自動產生Session;一個鏈接對應一個session,session能夠在一個會話中傳遞信息;經過setAttribute設置值;經過getAttribute得到值;由服務器端控制,服務器若是重啓了,信息就會丟失。
session.invalidate();//經過代碼註銷會話
<!--session-config能夠設置會話自動過時,時間分鐘爲單位--> <session-config> <session-timeout>1</session-timeout> </session-config>