一,Request
1,tomcat服务器接收到客户端发来的HTTP协议请求(行头体)后,解析出里面的信息,封装成对象发送给Servlet
里面的Request方法
Request的作用:
操作请求三部分(行头体)
Request获取请求行的作用的相关方法
在继承了HttpServlet 类的类中重写doGet方法,方法中调用以下方法
1,获取请求方式 :getMethod() 浏览器地址栏直接访问发送的是get请求
2,获取请求的url地址:getRequestURL() 浏览器输入的url(互联网访问该资源的地址)地址
3,获取请求的uri地址:getRequestURI() uri同意资源标识符(项目名+当前资源名)标识在服务器中可以使用这个地址来标识一个资源
4,获取请求的项目名:getContextPath()
5,获取请求的客户端的ip:getRemoteAddr()
6,获取请求的协议:getProtocle() http版本
获取请求头的作用的相关方法
在继承了HttpServlet 类的类中重写doGet方法,方法中调用以下方法
1,getHeader(key) key=user-agent是获取客户端的系统和浏览器的信息
获取请求体(请求参数)的方法(重要)
在继承了HttpServlet 类的类中重写doGet方法,方法中调用以下方法
1,根据一个参数名获取一个参数值 getParameter(name);
2,根据一个参数名获取多个参数值 getParameterValues(name); 返回一个包含多个value的数组
3,获取所有的请求参数 getParameterMap(); 返回一个map集合,参数名是map的key,参数值是map的value(string[])
遍历map集合:parameterMap.entrySet().for使用增强for循环拿到每一个键值对
然后stringEntry.getKey()拿到key,stringEntry.getValue()拿到value,value是个数组,可以Arrays.toString(value[])
post方式提交请求参数乱码的问题:在获取请求参数之前doGet方法中调用request.setCharacterEncoding("UTF-8"),然后再获取请求体参数值
4,BeanUtils工具封装 将多个请求参数封装到Map集合中有缺点,获取的时候要遍历,不方便,数据转换不够方便
所以我们将数据封装到JO就是对象中,
创建一个User类,实现序列化接口serializable,私有成员变量和浏览器传回的用户名密码等信息对应,添加对应的get/set方法,
doGet方法中获取参数 getParameterMap(); 返回一个map集合,
然后借助BeanUtils将ParameterMap中的数据封装到user对象中(引入BeanUtils的三个jar包,放在WEB-INF里面的lib文件夹里面,添加到图书馆)
User user = new User();
BeanUtils.populate(user, parameterMap) 有异常try/catchy一下
此时User中就存储了parameterMap中的数据,而且BeanUtils底层会自动进行数据类型的转换
Request请求转发:就是跳转到其他页面,添加完数据或删除完数据跳转到展示页面,底层也是map集合
doGet方法中
request.getRequestDispatcher("要跳转的相对或绝对路径").forward(request , response);
相对路径:不以/开头,以目标资源相对于当前资源的路径
绝对路径:以/开头,对于请求转发而言在完整的url基础之上省略"项目路径",对于非请求转发而言,在完整的url基础之上省略服务器路径
完整的url:http://服务器路径/项目名/资源名
Request作为域对象存数据(Request域对象的作用只在一次请求之间)
doGet方法中
String str="周杰伦";
将str存入域对象
request.setAttribute("str"= str);
跳转到另外一个request 使用请求转发
另外一个request中使用 String str = (String) request.getAttribute("str"); 就可以从域对象中获取str可以强转成String类型
二,Response
Response是响应,由服务器发给客户端,把需要传回的数据封装到Response对象,tomcat底层会自动把信息解析到http协议里面
response的作用1,设置响应行的数据
设置响应状态码:常见的状态码 200:ok 302:重定向 304:从缓存中获取 403:拒绝处理 404:资源未找到 500:服务器异常
doGet方法中
response.setStatus(403); 设置响应行
response的作用2,设置响应头的数据
常用的响应头
Refresh : 定时跳转
Location : 重定向地址(服务器告诉浏览器跳转到XXX)
Content- Disposition : 告诉浏览器下载
Content- Type : 设置响应内容的MiME类型(服务器告诉浏览器内容的类型)
通过设置响应头实现3秒钟跳转百度 response.setHeader("Rafresh","3 ; url = 百度一下,你就知道");
重定向跳转
response.setStatus(302);
response.setHeader("Location"," 百度一下,你就知道");
重定向跳转的简单方式
response.sendRedirect("百度一下,你就知道");
有时重定向内部资源时项目路径有时被更改就定向失败了,需要动态获取项目名request.getContexPath()
response.sendRedirect(request.getContexPath()+"/资源名");
重定向跳转和请求转发的区别
1,重定向跳转是浏览器发起的,请求转发跳转是服务器发起的
2,请求转发只能跳转到本项目资源,重定向可以跳转到外部资源
3,请求转发可以访问WEB-INF中的资源,重定向没办法访问WEB-INF中的资源
4,请求转发浏览器只发起一次请求,重定向浏览器会发起两次请求
5,请求转发地址栏不变,重定向地址栏会变化
6,请求转发能和request域对象存取值一起使用,重定向不能
通过response的字符输出流,向浏览器输出内容,write();方法只能输出字符串,print();方法既能输出字符串又能输出非字符串
response.getWriter().write("helloworld"); 输出中文会乱码
解决乱码
在输出流之前写: response.setContentType("text/html;charset=UTF-8");
通过response将图片显示到客户端浏览器
1,设置响应数据类型为:图片的mime-type
String mimeType = getServletContext().getMimeType("mm.jpg");
response.setHeader("Content-type",mimeType);
2,使用字节输入流,将图片读到内存中
InputStream is = getServletContext().getResourceAsStream("mm.jpg");
3,使用字节输出流,将图片输出到浏览器
ServletOutputStream os = response.getOutputStream();
4,循环读写
// byte[] buffer = new byte[1024];
int len=0;
while((len=is.read(buffer))!=-1){
os.write(buffer,0,len);
} //
//中间的代码不用自己写,可以给WEB-INF包的lib文件夹中添加io 的jar包 然后 IOUtils.copy(is,os);
os.close();
is.close();
注意:有可能报空指针异常,是因为复制过来的图片,没有在编译后的out文件夹中存在,造成读不到,需要复制图片到项目目录下,或者重新打包部署
下载文件案例
html文件
<!--设置跳转到ServletDownLoad页面进行增强下载,告诉Servlet要下载的文件名称用:?+filename--> <a href="download?filename=mm.jpeg">下载mm.jpeg</a>
java文件
@WebServlet("/download") public class ServletDownLoad extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //读取客户端想下载的文件名 String filename = request.getParameter("filename"); System.out.println(filename); //设置下载的文件的mime-type String mimeType = getServletContext().getMimeType(filename); response.setHeader("Content-type",mimeType); //使用字节输入流读取客户端想要下载的文件 InputStream is = getServletContext().getResourceAsStream(filename); //使用字节输出流将图片输出到浏览器 ServletOutputStream os = response.getOutputStream(); //下载中文文件乱码问题需要将filename进行url编码,使用UERLEncoder String encodeFileName = URLEncoder.encode(filename, "UTF-8"); //输出之前,通过设置响应头的方式提示客户端下载文件 response.setHeader("Content-Disposition","attachment;filename=" +encodeFileName); byte[] buffer = new byte[1024]; int len=0; while((len=is.read(buffer))!=-1){ os.write(buffer,0,len); } os.close(); is.close(); } }