1、servlet簡介html
servlet(Server Applet)是Java Servlet的簡稱,稱爲小服務程序或服務連機器,用java編寫的服務端程序,主要功能在於交互式地瀏覽和修改數據,生成動態Web內容。java
通常的動態web項目WEB-INF下都會新建一個web.xml,可是我新建的沒有,經查詢,解決方式: 選這個就能夠生成web.xmlweb
在src下定義LoginServlet:重寫HttpServlet的doGet方法和doPost方法。瀏覽器
package cn.java.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("我是doGet方法"); // super.doGet(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("我是doPost方法"); // super.doPost(req, resp); } }
web.xml中配置接口別名:tomcat
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>immoc_servlet1</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 給LoginServlet類配置一個對外訪問的虛擬路徑 --> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>cn.java.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/LoginServlet</url-pattern> </servlet-mapping> </web-app>
能夠將baseUrl寫活:服務器
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String basePath = request.getScheme() + ":" +"//"+request.getServerName()+":"+request.getServerPort()+ request.getServletContext().getContextPath()+"/"; %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="<%=basePath %>LoginServlet" method="post"> <p>用戶名:<input type="text" name="username"></p> <p>密碼:<input type="password" name="password"> </p> <input type="submit" value="提交"> </form> </body> </html>
servlet生命週期分爲三個階段session
1.初始化階段調用init()方法。(只有第一次被訪問的時候纔會執行)app
2.響應客戶請求階段調用service()方法。(每一次請求都會調用這個方法)jsp
3.終止階段調用destroy()方法。(工程從tomcat被移除的時候,調用這個方法)ide
新建一個Servelet,寫入以下代碼:
package cn.java.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/LifeServlet") public class LifeServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().append("Served at: ").append(request.getContextPath()); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
response.getWriter() :得到PrintWriter對象,用於向網頁輸出字符。
request.getContextPath():獲取servlet訪問路徑中的工程名部分。
servlet裏面能夠經過註解來實現對外訪問虛擬路徑。上面的webServlet註解。
請求與響應
1.瀏覽器對服務器的一次訪問稱之爲一次請求,請求用HttpServletRequest對象來表示。
2.服務器給瀏覽器的一次反饋稱之爲一次響應,響應用HttpServletResponse對象來表示。
package cn.java.servlet; import java.io.IOException; import javax.security.auth.message.callback.PrivateKeyCallback.Request; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println(username); System.out.println(password); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } }
上面代碼經過如下這種方式能夠解決亂碼:
username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
2、ServletContext和ServletConfig
java是一門面向對象的語言,萬事萬物皆對象。整個JavaWeb工程也能夠用一個對象來表示,這個對象就是ServletContext類型。
咱們能夠再web.xml文件中給某一個Servlet配置一些配置信息,當服務器被啓動的時候,這些配置信息就會被封裝到某一個ServletConfig對象中去,所以ServletConfig表示的是某一個Servlet配置文件。
新建Demo1Servlet 和 Demo2Servlet文件
分別寫入:
package cn.java.servlet; import java.io.IOException; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * ServletContext對象:表示的是整個javaweb工程servletconfig對象:表示的是某一個Servelt中的配置文件 * @author dongwenjie * */ @WebServlet("/Demo1Servlet") public class Demo1Servlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 獲取表明某一個JavaWeb工程的ServletContext對象 // Context對象是一個域對象,能夠往某一個域對象中存放數據,而且還能夠取出存放的數據 ServletContext context = this.getServletContext(); // 往context域對象中存放數據 context.setAttribute("username", "張三"); // 取出context域對象中的數據 Object result = context.getAttribute("username"); // 打印取出結果 System.out.println(result); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
package cn.java.servlet; import java.io.IOException; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/Demo2Servlet") public class Demo2Servlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context = this.getServletContext(); Object result = context.getAttribute("username"); System.out.println(result); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
在文件1中設置username的值,訪問文件2中這個值就能夠取到。感受跟瀏覽器端的localStorage和sessionStorage很像。
servletconfig對象用法:
新建Demo3Servlet文件:
<!-- 給Demo3Servlet類配置一個對外訪問的虛擬路徑 --> <servlet> <servlet-name>Demo3Servlet</servlet-name> <servlet-class>cn.java.servlet.Demo3Servlet</servlet-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Demo3Servlet</servlet-name> <url-pattern>/Demo3Servlet</url-pattern> </servlet-mapping>
在Demo3Servlet中獲取servletConfig對象。
package cn.java.servlet; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Demo3Servlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 首先獲取ServletConfig對象 ServletConfig sc = this.getServletConfig(); // 獲取sc這個對象中封裝的參數信息 String encoding = sc.getInitParameter("encoding"); System.out.println(encoding); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
3、轉發與重定向的區別
當咱們訪問一個servelet的時候,servelet幫咱們跳轉到另外的一個jsp頁面。跳轉就是用轉發和重定向來實現。
實現轉發調用的是HttpServletRequest對象中的方法,實現重定向調用的是HttpServletResponse對象中的方法。
轉發時瀏覽器中的url地址欄不會發生改變,重定向時瀏覽器中的url地址會發生改變。
轉發時瀏覽器只請求一次服務器,重定向時瀏覽器請求兩次服務器。
當登陸頁用戶名爲'admin' ,密碼爲'123'時,頁面轉發到成功頁面,不然到失敗頁面。
package cn.java.servlet; import java.io.IOException; import javax.security.auth.message.callback.PrivateKeyCallback.Request; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = req.getParameter("password"); username = new String(username.getBytes("ISO-8859-1"), "UTF-8"); System.out.println(username); System.out.println(password); // 1.經過轉發實現跳轉 if (("admin".equals(username)) && ("123".equals(password))) { req.getRequestDispatcher("/success.jsp").forward(req, resp); } else { req.getRequestDispatcher("/fail.jsp").forward(req, resp); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
經過重定向實現跳轉:
package cn.java.servlet; import java.io.IOException; import javax.security.auth.message.callback.PrivateKeyCallback.Request; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = req.getParameter("password"); username = new String(username.getBytes("ISO-8859-1"), "UTF-8"); System.out.println(username); System.out.println(password); // 1.經過轉發實現跳轉 if (("admin".equals(username)) && ("123".equals(password))) { req.getRequestDispatcher("/success.jsp").forward(req, resp); } else { // 2.經過重定向實現跳轉 // req.getRequestDispatcher("/fail.jsp").forward(req, resp); resp.sendRedirect("/immoc_servlet1/fail.jsp"); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
轉發和重定向給下一個頁面帶數據:
package cn.java.servlet; import java.io.IOException; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/Demo4Servlet") public class Demo4Servlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 轉發帶數據給某個JSP頁面 // request.setAttribute("username", "王二麻子"); // request.getRequestDispatcher("/demo.jsp").forward(request, response); //經過重定向帶數據過去 ServletContext sc = request.getServletContext(); sc.setAttribute("goods", "娃娃"); response.sendRedirect("/immoc_servlet1/demo.jsp"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
獲取數據
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>轉發與重定向獲取數據</title> </head> <body> <!-- 取出Demo04Servlet中傳遞過來的數據 --> <%-- <% String username = (String)request.getAttribute("username"); out.print(username); %> --%> <% String goods = (String)application.getAttribute("goods"); out.print(goods); %> </body> </html>