JavaWeb之Request&Response编程

1 servlet回顾

1.1 servlet

编写
1.编写实现类
	extends HttpServlet --> extends GenericServlet --> implements Servlet
	复写:doGet(HttpServletRequest,HttpServletResponse)、doPost
2.配置servlet,在web.xml文件配置(注册、映射)
<servlet>
  <servlet-name>
  <servlet-class>
<servlet-mapping>
  <servlet-name>
  <url-pattern>   
1.完全匹配:/a/b/c/xxxxx
2.不完全匹配: /xxx/*   --> /*
3.通配符匹配:*.xxx  (*.jsp、*.action等)
4.缺省路径: /   (tomcat为缺省路径配置一个servlet,用于处理html页面、图片等)

servlet生命周期 (servlet 单实例,多线程)
init(ServletConfig):只会执行一次,默认第一次访问,如果配置服务器启动(web.xml )
service(ServletRequest,ServletResponse):每请求一次,将执行一次。
destroy() 服务器正常关闭时,将执行一次。
使用细节
1.完成初始化操作:
复写init() , 此访问时GenericServlet提供的。
注意:如果复写 init(ServletConfig) 必须手动再方法体中 super.init(config)。否则空指针
2.获得当前servlet初始化参数
this.getInitParameter(“”) ; GenericServlet 实现 ServletConfig 提供4个便捷方法

3.获得ServletContext对象
this.getServletContext() GenericServlet提供便捷方法
this.getServletConfig().getServletContext() 获得GenericServlet缓存ServletConfig对象之后再操作。

1.2 ServletContext对象

一个web项目,只有一个ServletContext对象,此对象在服务器启动时tomcat创建,服务器关闭时tomcat销毁。
ServletContext对象 一般被称为:web项目的上下文对象。(servlet管理者)
api
1.web项目共享数据:xxxAttribute (set、get、remove)
2.获得系统初始化参数  getInitParameter(name)
	web.xml  
3.获得web项目资源
	getRealPath("/WEB-INF/web.xml")  --> String  d:/tomcat/webapps/day07/WEB-INF/web.xml
	getResourceAsStream("")  InputStream

2 response对象

回顾 http协议 响应
http响应包括:响应行、响应头、响应体
oracle(sun) 根据http协议规定 servlet相应规范(java接口),tomcat根据规范编写实现类。
接口:javax.servlet.ServletResponse、javax.servlet.http.HttpServletResponse
ServletResponse servlet通用规范,与协议无关。
HttpServletResponse就是与http协议有关规范。(提供与http协议有关的api)
response对象:服务器响应给浏览器的描述对象。

2.1 响应行

setStatus(int sc)  设置状态码
例如:
setStatus(404)
setStatus(HttpServletResponse. SC_NOT_FOUND)

2.2 响应头

setHeader(java.lang.String name, java.lang.String value) 设置指定的头,一般常用。
例如:setHeader("location","http://www.itheima.com");
setDateHeader(java.lang.String name, long date) 设置时间的(new Date().getTime())
setIntHeader(java.lang.String name, int value) 设置整形
例如:setIntHeader("expires", 1000) 设置过期时间的(缓存页面时间),如果0表示不缓存。现代浏览器不好使。

2.2.1 页面跳转(重定向)

方式1:手动方案
response.setStatus(302)
response.setHeader("location","http://www.itheima.com");
方式2:使用api
response.sendRedirect("http://www.itheima.com")

2.3 响应体

提供字符流:PrintWriter getWriter()		--> 提供write() 和  print()
提供字节流:ServletOutputStream getOutputStream()  --> 提供write() 和print()
注意:所有的print()方法底层调用都是write()  --> 流最后只使用一个write(int )
	 
流的使用,一般情况下
如果发送的中文数据等,使用字符流。例如:一般内容 getWriter()
如果发送二进制数据(字节)等,使用字节流。例如:下载
一般情况,如果是流,必须关闭流。但servlet中如果使用可以不关闭。
如果没有关闭流,tomcat在请求结束时,将自动的关闭。
注意:response 的两个流不能同时使用。

2.3.1 中文乱码处理

    • 2.1 通知tomcat发送的数据编码 – 注意必须在使用流之前
  •  response.setCharacterEncoding("UTF-8");
    
  •  注意:只通知tomcat,但不控制浏览器行为
    
    • 2.2 通过tomcat和浏览器 --强制要求浏览器查看编码
  •  方式1:手动方案
    
  •  	response.setHeader("content-type", "text/html;charset=UTF-8");
    
  •  方式2:使用api【】
    
  •  	response.setContentType("text/html;charset=UTF-8");
    
    • 2.3 通知tomcat,在使用html通知浏览器 (html源码)
  •  注意:建议浏览器应该使用编码,不能强制要求。
    

2.4 response输出缓存

response中使用流向浏览器发送数据,首先数据将写入 数据流的缓存中,但缓存大小8k时,将自动刷新到浏览器。
	api使用
isCommitted()  缓存是否刷新过
flushBuffer() 手动的刷新 输出缓存
getBufferSize() 获得大小
resetBuffer() 清空缓存

3 request对象

回顾 http协议 请求
包含:请求行,请求头,请求体
oracle 根据 http协议,定义 request相应规范(接口),tomcat实现request规范
接口:javax.servlet.ServletRequest、javax.servlet.http.HttpServletRequest
浏览器发送请求,tomcat将创建 request和response 对象,传递doGet/doPost方法,方法体可以具体对象。

3.1 请求行

HttpServletRequest接口 提供 getMethod()  获得GET/POST 请求方式
路径访问

//实际访问路径 http://localhost:8080/day08/Demo05Servlet?username=jack&password=1234

	//1 统一资源标记符  。例如: /day08/Demo05Servlet
	String uri = request.getRequestURI();
	System.out.println(uri);
	
	//2统一资源定位符:例如:http://localhost:8080/day08/Demo05Servlet
	StringBuffer url = request.getRequestURL();
	System.out.println(url);
	//3 协议和版本 ,  例如: HTTP/1.1
	String protocol = request.getProtocol();
	System.out.println(protocol);
	//协议,例如: http
	String scheme = request.getScheme();
	System.out.println(scheme);
	
	//4 主机(域名) , 例如:localhost ,如果使用ip地址,就显示ip
	String serverName = request.getServerName();
	System.out.println(serverName);
	
	//5 端口 , 例如:8080
	int port = request.getServerPort();
	System.out.println(port);
	
	//6 发布到tomcat下的项目名称 【】
	String contextPath = request.getContextPath();
	System.out.println(contextPath);
	
	//7 servlet路径 , 例如:/Demo05Servlet【】
	String servletPath = request.getServletPath();
	System.out.println(servletPath);
	
	//8 所有请求参数,及?之后所有 ,例如: username=jack&password=1234
	String queryString = request.getQueryString();
	System.out.println(queryString);
	//9远程主机的ip地址【】
	String remoteAddr = request.getRemoteAddr();
	System.out.println(remoteAddr);

3.2 请求头

String getHeader(java.lang.String name) 获得指定头内容String【】
例如:request.getHeader("referer");
long getDateHeader(java.lang.String name) 获得指定头内容Date
int getIntHeader(java.lang.String name)  获得指定头内容int
Enumeration getHeaders(java.lang.String name) 获得指定名称所有内容

3.3 请求体–参数获取

请求参数:
get请求参数:http://localhost:8080/day08/Demo07Servlet?username=jack&password=1234
post请求参数: 
String request.getParameter(String) 获得指定名称,一个请求参数值。 String[] request.getParameterValues(String) 获得指定名称,所有请求参数值。例如:checkbox、select等 Map request.getParameterMap() 获得所有的请求参数。 map.key : 请求参数名称,map.value : 名称对应的所有参数值。

3.3.1 请求参数乱码

post请求和get请求,中文乱码处理方式不同。(不含tomcat8)
post 请求处理
request.setCharacterEncoding("UTF-8") 修改tomcat默认对请求体的编码方式
post请求内容存放请求体中,所以可以使用上面的api进行乱码处理。
get请求乱码处理
在获得数据的基础上,进行手动的编码。
new String(xxx.getBytes("ISO-8859-1") , "UTF-8")

3.4 属性操作

request 属性操作,服务器内部事情,浏览器时不知晓的。
Servlet 3作用域对象:ServletContext、ServletRequest、HttpSession
3个对象都提供xxxAttribute (set、get、remove)
如果要使用request属性,必须和“请求转发”结合使用。
request属性特定:在一次请求中共享数据。一次请求可以涉及页面个数:默认情况1个,使用请求转发多个。

4 RequestDispatcher 请求调度对象

请求调度:从当前servlet A,调度另一个servlet B(资源:html、servlet、jsp等)
在服务器内部,从一个servlet去执行另一个servlet,浏览器不知道的。
获取
ServletRequest.getRequestDispatcher(String path) 获得请求调度对象,如果/开头,表示web项目根(context root)
ServletContext.getRequestDispatcher(String path) 获得请求调度对象,必须以/开头,表示web项目根
ServletContext.getNamedDispatcher(java.lang.String) (了解)

例如:
当前servlet路径: http://localhost:8080/day08/a/b/Demo01Servlet
另一个servlet路径:http://localhost:8080/day08/a/b/Demo02Servlet

ServletRequest (常用)
request.getRequestDispatcher(“Demo02Servlet”)
request.getRequestDispatcher(“/a/b/Demo02Servlet”) --注意:没有day08 , (扩展:对比重定向)

ServletContext
this.getServletContext().getRequestDispatcher("/a/b/Demo02Servlet ")

api
forward(ServletRequest request, ServletResponse response) 请求转发
	A 转发 B,只输出B内容到浏览器。(如果A没有数据发送 response.isComitted = false,将清空缓存)
	请求转发只输出最后一个servlet内容
	如果 isCommitted = true ,在进行forward将抛异常。一般情况如果输出少量的数据,认为isCommitted=false
include(ServletRequest request, ServletResponse response)  请求包含
	A 包含 B,先输出A内容到浏览器,在输出B的内容到浏览器。
	请求包含,输出所有servlet 汇总后的内容。
应用场景
请求转发:第一个servlet处理数据,第二个servlet显示数据 -- MVC软件设计模式
	思想:处理与显示相分离

AServlet{
//处理
** 使用dom4j 查询所有数据
List allBook = …
//将数据存request属性中(request作用域: 数据的作用范围)
request.setAttribute(“allBook”,allBook);
//请求转发
request.getRequestDispatcher(“Bservlet”).forward(1,2);
}

BServlet{
// 获得request属性中数据 – 此数据从服务器获得
List allBook = (List)request.getAttribute(“allBook”); //注意:request.getParameter(“”) 从浏览器
//显示
}

总结:
1.web项目根:(context root)
开发:G:\Workspaces\hei16\day08\WebRoot
运行:D:\java\tomcat\apache-tomcat-7.0.53\webapps\day08
2. web站点根:
运行:D:\java\tomcat\apache-tomcat-7.0.53\webapps
3.编码
页面(html、jsp)、servlet 请求和响应 编码 必须保持一致。
一般情况下:servlet开始2段内容
request.setCharacterEncoding(“UTF-8”);
response.setContentType(“text/html;charset=UTF-8”);
4.请求转发特点
* 请求路径没有改变,但可以涉及服务器端多个资源(你和媳妇)
* 可以在一次请求中,共享request作用域的数据。
* 一次请求,使用请求转发,tomcat将创建两个request,和一个response对象
两个request对象数据相同的(可以理解成对象被克隆了)

你可能感兴趣的:(前端,Java,servlet,tomcat,java)