JAVA - 【Tomcat】Servlet 请求与响应

目录

  • HttpServletResponse
    • 操作响应行
      • 设置响应状态码
    • 操作响应头
      • 重定向
      • 刷新
    • 操作响应正文
      • 改变服务器使用的字符集
      • 告诉浏览器需要使用什么字符集解码
      • 获得字节输出流( ServletOutputStream getOutputStream() )
      • 获得字符输出流( PrintWriter getWriter() )
  • HttpServletRequest
    • 请求消息行
      • 路径获取
    • 获取请求头的信息
      • 获取请求头的信息
      • 获取请求头所有信息
      • 获取请求头同一属性的所有值
    • 请求正文
      • 设置post表单提交数据的解码字符集
      • 处理表单数据
        • String   getParameter(String name)
        • String[] getParameterValues(String name)
        • Map<String, String[]> getParameterMap()
      • 域对象:request
        • 操作request维护的Map
        • 利用request完成请求转发
      • 请求转发与重定向的区别


<一> HttpServletResponse

注:本篇文章仅仅分析常用方法,所有内容可以参考JAVA EE API

1> 操作响应行

  • 设置响应状态码
|-response.setStatus(int sc) 设置相应状态码
    |-SC_INTERNAL_SERVER_ERROR 500
    |-SC_METHOD_not_ALLOWED    405
        |-未重写doGet、doPost自动抛出
    |-SC_NOT_FOUND             404
    |-SC_OK                    200

2> 操作响应头

  • 重定向
  • 覆盖设置响应头键值
    • refresh刷新
    • refresh重定向
    • location重定向
|-响应头:
        sendRedirect(String location)
        setHeader(String name,String value)
            |-覆盖
        addHeader(String name,String value)
            |-添加
        setIntHeader(String name,int value)

3> 操作响应正文

  • 改变服务器使用的字符集
  • 告诉浏览器需要使用什么字符集解码
|-告诉服务器使用UTF-8字符集解析数据
    |-response.setCharacterEncoding("UTF-8");
    
|-浏览器解析错误,因为浏览器默认编码错误,需要告诉浏览器使用指定编码解析
    |-response.setHeader("content-type","text/html;charset=UTF-8"); 
    
|-上述两个操作被封装进一个方法
    |-response.setContentType("text/html;charset=GBK");
        |-写错会变成下载文件
  • 获得字节输出流( ServletOutputStream getOutputStream() )

ServletOutputStream sos = response.getOutputStream();


//示例(输入输出流)
//通过全路径获取字节输入流
String path = this.getServletContext().getRealPath("/img/a.jpg");
FileInputStream fis = new FileInputStream(path);
//创建一个字节输出流
ServletOutputStream sos = response.getOutputStream();
//通过全路径获取文件名并URL化
String filename = path.substring(path.lastIndexOf("\\")+1);
filename = URLEncoder.encode(filename,"UTF-8");
  • 获得字符输出流( PrintWriter getWriter() )
response.getWriter()

<二> HttpServletRequest

1> 请求消息行

getMethod()                获取请求方式:  GET
getRequestURL()            获取全路径:     http://localhost/day0523_servlet/servlet/demo7
    getRequestURI()        获取资源名部分: /day0523_servlet/servlet/demo7
        getContextPath()   获取当前应用名:    /day0523_servlet

getQueryString()  获取请求行的参数部分

2> 获取请求头的信息

String getHeader(String name)
Enumeration getHeaderNames()
  • 获取浏览器类型
private void checkBrowserType(HttpServletRequest request) {
	String userAgent = request.getHeader("User-Agent");
	//Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363
	System.out.println(userAgent);
	
	if(userAgent.toLowerCase().contains("firefox")){
		System.out.println("访问浏览器类型:Firefox");
	}else if(userAgent.toLowerCase().contains("edge")){
		System.out.println("访问浏览器类型:Microsoft Edge");
	}else if(userAgent.toLowerCase().contains("chrome")){
		System.out.println("访问浏览器类型:Chrome");
	}else if(userAgent.toLowerCase().contains("safari")){
		System.out.println("访问浏览器类型:Safari");
	}else{
		System.out.println("访问浏览器类型:其他");
	}
}
  • 获取请求头所有信息
/**
 * 打印请求头所有信息于Tomcat控制台
 * @param HttpServletRequest request
 */
private void printAllHeaderInfo(HttpServletRequest request) {
	Enumeration<String> headerNames = request.getHeaderNames();
	 while(headerNames.hasMoreElements()){
		 String e = headerNames.nextElement();
		 System.out.println(e+":"+request.getHeader(e));
	 }
	 
	 // host:localhost
	 // user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0
	 // accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
	 // accept-language:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
	 // accept-encoding:gzip, deflate
	 // connection:keep-alive
	 // upgrade-insecure-requests:1
}
  • 获取请求头同一属性的所有值
    • accept-language为例
/**
 * 获取请求头同一属性的所有值
 * accept-language:
 * 		浏览器支持的语言类型,逗号分隔,q表示权重系数[0,1]
 * @param request
 */
private void printHeaders(HttpServletRequest request) {
	
	Enumeration<String> headers = request.getHeaders("accept-language");
	//结果: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
	while (headers.hasMoreElements()) {
		String e = headers.nextElement();
		System.out.println(e);
	}

	String lang = request.getHeader("accept-language");
	String[] langs = lang.split(",");
	for(String i:langs){
		System.out.println(i);
	}
}

3> 请求消息正文(处理post方式提交的表单)

  • 设置post表单提交数据的解码字符集
    • request.setCharacterEncoding("UTF-8");
  • String   getParameter(String name)
  • String[] getParameterValues(String name)
  • Map<String, String[]> getParameterMap()
private void dealForm1(HttpServletRequest request) {
	try {
		User u = new User();
		Map<String, String[]> parameterMap = request.getParameterMap();
		
		for(Map.Entry<String, String[]> m:parameterMap.entrySet()){
			String name = m.getKey();
			String[] value = m.getValue();
			//JavaBean内省机制
			PropertyDescriptor pd = new PropertyDescriptor(name,User.class);
			Method settler = pd.getWriteMethod();
			if(value.length==1){
				settler.invoke(u, value[0]);
			}else{
				settler.invoke(u, (Object)value);
			}
		}
		System.out.println(u);
	} catch (Exception e) {
		e.printStackTrace();
	}
}

 

private void dealForm2(HttpServletRequest request) {
	//使用BeanUtils包
	//BeanUtils.populate(Object,Map<String,? extends Object>)
	//http://commons.apache.org/proper/commons-beanutils/download_beanutils.cgi
	//http://commons.apache.org/proper/commons-logging/download_logging.cgi

	User u = new User();
	try {
		BeanUtils.populate(u,request.getParameterMap());
	} catch (IllegalAccessException e) {
		e.printStackTrace();
	} catch (InvocationTargetException e) {
		e.printStackTrace();
	}
	System.out.println(u);
}

register.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="/day0525_servlet/servlet/demo1" method="post">
       	用户名:<input type="text" name="username"/><br/>
        密码<input type="text" name="password"/><br/>
        
       	性别:<input type="radio" name="sex" value="male" checked="checked"/>男
        <input type="radio" name="sex" value="female" checked="checked"/>女<br/>
        
       	爱好:<input type="checkbox" name="hobby" value="music" checked="checked"/>音乐
            <input type="checkbox" name="hobby" value="book"/>阅读
            <input type="checkbox" name="hobby" value="file"/>电影<br/>
        
        城市:<select name="city">
                <option>-----请选择-----</option>
                <option value="bj">北京</option>
                <option value="sh">上海</option>
                <option value="gz">广州</option>
              </select>
        <br/>
        <input type="submit" value="注册"/>
        <br/>
    </form>
</body>
</html>

4> 域对象:request

  • 操作request维护的Map
  • 利用request完成请求转发

其内部维护着一个Map集合,可以通过setAttribute、getAttribute、removeAttribute进行操作;

  • 请求转发与重定向的区别

请求转发:在服务器端完成(可以传递数据:request维护的Map

        上述的“欢迎!”会被显示在demo2 页面中

重定向:在客户端完成(意味着可以跳转到其他互联网页面:http://www.baidu.com)

        上述的“欢迎!”会被显示在demo3 页面中(意味着打开了两次网页

        response.sendRedirect("/day0525_servlet/servlet/demo2");

                response.setStatus(302);
               //response.sendRedirect(request.getContextPath()+"/servlet/demo3");
                response.sendRedirect("http://www.baidu.com");

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章