RequestResponseServletContext
生活随笔
收集整理的這篇文章主要介紹了
RequestResponseServletContext
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
Request:
1. request對象和response對象的原理1. request和response對象是由服務器創建的。我們來使用它們2. request對象是來獲取請求消息,response對象是來設置響應消息2. request對象繼承體系結構: ServletRequest -- 接口| 繼承HttpServletRequest -- 接口| 實現org.apache.catalina.connector.RequestFacade 類(tomcat)3. request功能:1. 獲取請求消息數據1. 獲取請求行數據* GET /day14/demo1?name=zhangsan HTTP/1.1* 方法:1. 獲取請求方式 :GET* String getMethod() 2. (*)獲取虛擬目錄:/day14* String getContextPath()3. 獲取Servlet路徑: /demo1* String getServletPath()4. 獲取get方式請求參數:name=zhangsan* String getQueryString()5. (*)獲取請求URI:/day14/demo1* String getRequestURI(): /day14/demo1* StringBuffer getRequestURL() :http://localhost/day14/demo1* URL:統一資源定位符 : http://localhost/day14/demo1 中華人民共和國* URI:統一資源標識符 : /day14/demo1 共和國6. 獲取協議及版本:HTTP/1.1* String getProtocol()7. 獲取客戶機的IP地址:* String getRemoteAddr()2. 獲取請求頭數據* 方法:* (*)String getHeader(String name):通過請求頭的名稱獲取請求頭的值* Enumeration<String> getHeaderNames():獲取所有的請求頭名稱3. 獲取請求體數據:* 請求體:只有POST請求方式,才有請求體,在請求體中封裝了POST請求的請求參數* 步驟:1. 獲取流對象* BufferedReader getReader():獲取字符輸入流,只能操作字符數據* ServletInputStream getInputStream():獲取字節輸入流,可以操作所有類型數據* 在文件上傳知識點后講解2. 再從流對象中拿數據2. 其他功能:1. 獲取請求參數通用方式:不論get還是post請求方式都可以使用下列方法來獲取請求參數1. String getParameter(String name):根據參數名稱獲取參數值 username=zs&password=1232. String[] getParameterValues(String name):根據參數名稱獲取參數值的數組 hobby=xx&hobby=game3. Enumeration<String> getParameterNames():獲取所有請求的參數名稱4. Map<String,String[]> getParameterMap():獲取所有參數的map集合* 中文亂碼問題:* get方式:tomcat 8 已經將get方式亂碼問題解決了* post方式:會亂碼* 解決:在獲取參數前,設置request的編碼request.setCharacterEncoding("utf-8");2. 請求轉發:一種在服務器內部的資源跳轉方式1. 步驟:1. 通過request對象獲取請求轉發器對象:RequestDispatcher getRequestDispatcher(String path)2. 使用RequestDispatcher對象來進行轉發:forward(ServletRequest request, ServletResponse response) 2. 特點:1. 瀏覽器地址欄路徑不發生變化2. 只能轉發到當前服務器內部資源中。3. 轉發是一次請求3. 共享數據:* 域對象:一個有作用范圍的對象,可以在范圍內共享數據* request域:代表一次請求的范圍,一般用于請求轉發的多個資源中共享數據* 方法:1. void setAttribute(String name,Object obj):存儲數據2. Object getAttitude(String name):通過鍵獲取值3. void removeAttribute(String name):通過鍵移除鍵值對4. 獲取ServletContext:* ServletContext getServletContext()案例:用戶登錄
* 用戶登錄案例需求:1.編寫login.html登錄頁面username & password 兩個輸入框2.使用Druid數據庫連接池技術,操作mysql,day14數據庫中user表3.使用JdbcTemplate技術封裝JDBC4.登錄成功跳轉到SuccessServlet展示:登錄成功!用戶名,歡迎您5.登錄失敗跳轉到FailServlet展示:登錄失敗,用戶名或密碼錯誤* 分析* 開發步驟1. 創建項目,導入html頁面,配置文件,jar包2. 創建數據庫環境CREATE DATABASE day14;USE day14;CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(32) UNIQUE NOT NULL,PASSWORD VARCHAR(32) NOT NULL);3. 創建包cn.itcast.domain,創建類Userpackage cn.itcast.domain;/*** 用戶的實體類*/public class User {private int id;private String username;private String password;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}}4. 創建包cn.itcast.util,編寫工具類JDBCUtilspackage cn.itcast.util;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;import javax.xml.crypto.Data;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;/*** JDBC工具類 使用Durid連接池*/public class JDBCUtils {private static DataSource ds ;static {try {//1.加載配置文件Properties pro = new Properties();//使用ClassLoader加載配置文件,獲取字節輸入流InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");pro.load(is);//2.初始化連接池對象ds = DruidDataSourceFactory.createDataSource(pro);} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*** 獲取連接池對象*/public static DataSource getDataSource(){return ds;}/*** 獲取連接Connection對象*/public static Connection getConnection() throws SQLException {return ds.getConnection();}}5. 創建包cn.itcast.dao,創建類UserDao,提供login方法package cn.itcast.dao;import cn.itcast.domain.User;import cn.itcast.util.JDBCUtils;import org.springframework.dao.DataAccessException;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;/*** 操作數據庫中User表的類*/public class UserDao {//聲明JDBCTemplate對象共用private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());/*** 登錄方法* @param loginUser 只有用戶名和密碼* @return user包含用戶全部數據,沒有查詢到,返回null*/public User login(User loginUser){try {//1.編寫sqlString sql = "select * from user where username = ? and password = ?";//2.調用query方法User user = template.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),loginUser.getUsername(), loginUser.getPassword());return user;} catch (DataAccessException e) {e.printStackTrace();//記錄日志return null;}}}6. 編寫cn.itcast.web.servlet.LoginServlet類package cn.itcast.web.servlet;import cn.itcast.dao.UserDao;import cn.itcast.domain.User;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@WebServlet("/loginServlet")public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.設置編碼req.setCharacterEncoding("utf-8");//2.獲取請求參數String username = req.getParameter("username");String password = req.getParameter("password");//3.封裝user對象User loginUser = new User();loginUser.setUsername(username);loginUser.setPassword(password);//4.調用UserDao的login方法UserDao dao = new UserDao();User user = dao.login(loginUser);//5.判斷userif(user == null){//登錄失敗req.getRequestDispatcher("/failServlet").forward(req,resp);}else{//登錄成功//存儲數據req.setAttribute("user",user);//轉發req.getRequestDispatcher("/successServlet").forward(req,resp);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);}}7. 編寫FailServlet和SuccessServlet類@WebServlet("/successServlet")public class SuccessServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//獲取request域中共享的user對象User user = (User) request.getAttribute("user");if(user != null){//給頁面寫一句話//設置編碼response.setContentType("text/html;charset=utf-8");//輸出response.getWriter().write("登錄成功!"+user.getUsername()+",歡迎您");}} @WebServlet("/failServlet")public class FailServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//給頁面寫一句話//設置編碼response.setContentType("text/html;charset=utf-8");//輸出response.getWriter().write("登錄失敗,用戶名或密碼錯誤");}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}}8. login.html中form表單的action路徑的寫法* 虛擬目錄+Servlet的資源路徑9. BeanUtils工具類,簡化數據封裝* 用于封裝JavaBean的1. JavaBean:標準的Java類1. 要求:1. 類必須被public修飾2. 必須提供空參的構造器3. 成員變量必須使用private修飾4. 提供公共setter和getter方法2. 功能:封裝數據2. 概念:成員變量:屬性:setter和getter方法截取后的產物例如:getUsername() --> Username--> username3. 方法:1. setProperty()2. getProperty()3. populate(Object obj , Map map):將map集合的鍵值對信息,封裝到對應的JavaBean對象中Response對象
* 功能:設置響應消息1. 設置響應行1. 格式:HTTP/1.1 200 ok2. 設置狀態碼:setStatus(int sc) 2. 設置響應頭:setHeader(String name, String value) 3. 設置響應體:* 使用步驟:1. 獲取輸出流* 字符輸出流:PrintWriter getWriter()* 字節輸出流:ServletOutputStream getOutputStream()2. 使用輸出流,將數據輸出到客戶端瀏覽器* 案例:1. 完成重定向* 重定向:資源跳轉的方式* 代碼實現://1. 設置狀態碼為302response.setStatus(302);//2.設置響應頭locationresponse.setHeader("location","/day15/responseDemo2");//簡單的重定向方法response.sendRedirect("/day15/responseDemo2");* 重定向的特點:redirect1. 地址欄發生變化2. 重定向可以訪問其他站點(服務器)的資源3. 重定向是兩次請求。不能使用request對象來共享數據* 轉發的特點:forward1. 轉發地址欄路徑不變2. 轉發只能訪問當前服務器下的資源3. 轉發是一次請求,可以使用request對象來共享數據* forward 和 redirect 區別* 路徑寫法:1. 路徑分類1. 相對路徑:通過相對路徑不可以確定唯一資源* 如:./index.html* 不以/開頭,以.開頭路徑* 規則:找到當前資源和目標資源之間的相對位置關系* ./:當前目錄* ../:后退一級目錄2. 絕對路徑:通過絕對路徑可以確定唯一資源* 如:http://localhost/day15/responseDemo2 /day15/responseDemo2* 以/開頭的路徑* 規則:判斷定義的路徑是給誰用的?判斷請求將來從哪兒發出* 給客戶端瀏覽器使用:需要加虛擬目錄(項目的訪問路徑)* 建議虛擬目錄動態獲取:request.getContextPath()* <a> , <form> 重定向...* 給服務器使用:不需要加虛擬目錄* 轉發路徑2. 服務器輸出字符數據到瀏覽器* 步驟:1. 獲取字符輸出流2. 輸出數據* 注意:* 亂碼問題:1. PrintWriter pw = response.getWriter();獲取的流的默認編碼是ISO-8859-12. 設置該流的默認編碼3. 告訴瀏覽器響應體使用的編碼//簡單的形式,設置編碼,是在獲取流之前設置response.setContentType("text/html;charset=utf-8");3. 服務器輸出字節數據到瀏覽器* 步驟:1. 獲取字節輸出流2. 輸出數據4. 驗證碼1. 本質:圖片2. 目的:防止惡意表單注冊ServletContext對象:
1. 概念:代表整個web應用,可以和程序的容器(服務器)來通信 2. 獲取:1. 通過request對象獲取request.getServletContext();2. 通過HttpServlet獲取this.getServletContext(); 3. 功能:1. 獲取MIME類型:* MIME類型:在互聯網通信過程中定義的一種文件數據類型* 格式: 大類型/小類型 text/html image/jpeg* 獲取:String getMimeType(String file) 2. 域對象:共享數據1. setAttribute(String name,Object value)2. getAttribute(String name)3. removeAttribute(String name)* ServletContext對象范圍:所有用戶所有請求的數據3. 獲取文件的真實(服務器)路徑1. 方法:String getRealPath(String path) String b = context.getRealPath("/b.txt");//web目錄下資源訪問System.out.println(b);String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目錄下的資源訪問System.out.println(c);String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目錄下的資源訪問System.out.println(a);案例:
* 文件下載需求:1. 頁面顯示超鏈接2. 點擊超鏈接后彈出下載提示框3. 完成圖片文件下載* 分析:1. 超鏈接指向的資源如果能夠被瀏覽器解析,則在瀏覽器中展示,如果不能解析,則彈出下載提示框。不滿足需求2. 任何資源都必須彈出下載提示框3. 使用響應頭設置資源的打開方式:* content-disposition:attachment;filename=xxx* 步驟:1. 定義頁面,編輯超鏈接href屬性,指向Servlet,傳遞資源名稱filename2. 定義Servlet1. 獲取文件名稱2. 使用字節輸入流加載文件進內存3. 指定response的響應頭: content-disposition:attachment;filename=xxx4. 將數據寫出到response輸出流* 問題:* 中文文件問題* 解決思路:1. 獲取客戶端使用的瀏覽器版本信息2. 根據不同的版本信息,設置filename的編碼方式不同轉載于:https://my.oschina.net/u/3668429/blog/3043396
總結
以上是生活随笔為你收集整理的RequestResponseServletContext的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java-自定义数据排序
- 下一篇: Fabric Kafka入门