相關(guān)筆記:【JavaWeb之Servlet】
1、Servlet復(fù)習(xí)
Servlet是JavaWeb的三大組件之一:
- Servlet
- Filter 過(guò)濾器
- Listener 監(jiān)聽(tīng)器
Servlet是運(yùn)行在服務(wù)器上的一個(gè)Java小程序,它可以接收客戶端發(fā)送過(guò)來(lái)的請(qǐng)求,并響應(yīng)數(shù)據(jù)給客戶端。
Servlet接口的實(shí)現(xiàn)和繼承關(guān)系如下,日常開(kāi)發(fā)中直接繼承HttpSerlvet類就好:
每次只要有請(qǐng)求進(jìn)入Tomcat服務(wù)器,Tomcat服務(wù)器就會(huì)把請(qǐng)求過(guò)來(lái)的HTTP協(xié)議信息解析好封裝到HttpServletRequest對(duì)象中,然后傳遞到上圖中的service方法(doGet、doPost)中,用于給開(kāi)發(fā)者來(lái)編寫(xiě)自己需要的邏輯。
2、HttpServletRequest的使用
常用方法:
- getRequestURI() 獲取請(qǐng)求的資源路徑
- getRequestURL() 獲取請(qǐng)求的統(tǒng)一資源定位符
- getRemoteHost() 獲取客戶端的IP地址
- getHeader() 獲取請(qǐng)求頭
- getParameter() 獲取請(qǐng)求的參數(shù)
- getParameterValues() 獲取請(qǐng)求的參數(shù)(多個(gè)值的時(shí)候)
- getMethod() 獲取請(qǐng)求的方式GET、POST
- setAttribute(key,value) 設(shè)置域數(shù)據(jù)
- getAttribute(key)獲取域數(shù)據(jù)
- getRequestDispatcher() 獲取請(qǐng)求轉(zhuǎn)發(fā)對(duì)象
其中,Header和請(qǐng)求參數(shù)的相關(guān)方方法的類型與形參:
// 獲取請(qǐng)求頭數(shù)據(jù),通過(guò)請(qǐng)求頭名稱獲取值
String getHeader(String name)
// 獲取所有請(qǐng)求頭信息
Enumeration getHeaderNames()
請(qǐng)求參數(shù):
// 獲取請(qǐng)求參數(shù)通用方式(根據(jù)參數(shù)名稱獲取參數(shù)值) username=zhangsan
String getParameter(String name)
// 獲取請(qǐng)求參數(shù)名稱獲取參數(shù)值的數(shù)組 hobby=xx&hobby=game
String[] getParameters(String name)
// 獲取請(qǐng)求參數(shù)名稱(與獲取請(qǐng)求頭方法類似)
Enumeration getParameterNames()
// 獲取所有參數(shù)的Map集合
Map getParameterMap()
//....
Enumeration<String> enumeration = request.getParameterNames();
Map<String,String> parameterMap = new HashMap<String,String>();
while (enumeration.hasMoreElements()){
String parameter = enumeration.nextElement();
parameterMap.put(parameter,request.getParameter(parameter));
}
//...
示例代碼:
package com.llg.web;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.Arrays;
public class HttpServlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
String[] hobby = request.getParameterValues("hobby");
System.out.println("username:" + username);
System.out.println("password:" + password);
System.out.println("hobby:" + Arrays.asList(hobby));
System.out.println("URI:" + request.getRequestURI());
System.out.println("URL:" + request.getRequestURL());
System.out.println("Client_IP:"+request.getRemoteHost());
System.out.println("User-Agent:" + request.getHeader("User-Agent"));
System.out.println("Request-Method:" + request.getMethod());
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* setCharacterEncoding方法設(shè)置請(qǐng)求的字符集為UTF-8,解決post請(qǐng)求的中文亂碼問(wèn)題
* 注意要在獲取請(qǐng)求參數(shù)之前調(diào)用
*/
request.setCharacterEncoding("UTF-8");
System.out.println("-----POST-----");
String username = request.getParameter("username");
String password = request.getParameter("password");
String[] hobby = request.getParameterValues("hobby");
System.out.println("username:" + username);
System.out.println("password:" + password);
System.out.println("hobby:" + Arrays.asList(hobby));
}
}
3、HttpServletResponse的使用
HttpServletResponse和HttpServletRequest類一樣,每次請(qǐng)求進(jìn)來(lái),Tomcat服務(wù)器都會(huì)創(chuàng)建一個(gè)Response對(duì)象傳給Servlet程序使用。
HttpServletRequest表示請(qǐng)求過(guò)來(lái)的信息,HttpServletResponse表示所有響應(yīng)的信息,如果需要修改或設(shè)置返回給客戶端的信息,則可通過(guò)HttpServletResponse對(duì)象來(lái)設(shè)置。
關(guān)于兩個(gè)輸出流:
- 字節(jié)流 getOutputStream()方法,常用于下載(傳遞二進(jìn)制數(shù)據(jù))
- 字符流 getWriter()方法,常用于回傳字符串(用的多)
兩個(gè)流不能同時(shí)使用。
運(yùn)行:
給客戶端回傳信息:
運(yùn)行:
注意回傳中文信息,發(fā)生亂碼時(shí),需要設(shè)置字符集
//具體看文章開(kāi)頭的筆記【Servlet】
response.setHeader("Content-Type","text/html; charset=UTF-8");
4、獲取HttpServletRequest和HttpServletResponse
除了正常的Tomcat打包傳過(guò)來(lái)的HttpServletRequest和HttpServletResponse對(duì)象,也可以在其他地方自己獲取。
途徑一:直接注入
@Resource
private HttpServletRequest request;
//@Autowired
@Resource
private HttpServletResponse response;
途徑二:controller層中直接用
@GetMapping(value = "/abc/")
public String doSomething(HttpServletRequest request,HttpServletResponse response) {
//...
}
途徑三:從RequestContextHolder中獲取文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-628562.html
關(guān)于SpringMVC的RequestContextHolder:即持有上下文的Request容器,參考:https://developer.aliyun.com/article/908719文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-628562.html
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = servletRequestAttributes.getRequest();
HttpServletResponse response = servletRequestAttributes.getResponse();
到了這里,關(guān)于HttpServletRequest和HttpServletResponse的獲取與使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!