[关闭]
@martin0207 2017-11-24T15:23:24.000000Z 字数 2916 阅读 885

Servlet学习

JavaWeb


获取资源文件

使用.Properties文件时,需要获取真实路径
在Servlet中,可以直接获取ServletContext,然后获取RealPath,拼接文件名以及后缀
在其他Service文件中,没有父类方法可以直接获取ServletContext,需要用类加载器去获取路径:
Srvice.class.getClassLoader.getResource("config.preproties").getPath()
../代表上一级
类加载器是加载class目录的内容,如果文件所在地不是,需要进行文件路径调整。

HttpServletResponse & HttpServletRequest

ServletResponse

通用的

输出具有字符流和字节流两种。
使用中文时,会存在编码格式问题

如果编码格式不同,则可以通过请求头Content-Type,text/html;charset=utf-8设置编码格式来解决乱码问题
如果要使用字符流输出:response.getWriter().write("这是中文"),需要通知服务器的编码格式:response.setCharacterEncoding("gbk")
当然,使用response.setHeader("Content-Type","text/html;charset=gbk")也可以通知客户端的编码格式,服务器在执行该语句的时候,也会自动设置服务器的编码格式为gbk

下载功能

使用请求头的Content-Disposition和值attachment;filename=1.jpg来实现文件下载
response.setHeader("Content-Disposition","attachment;filename=1.jpg")
请求头中的内容,都不可以包含中文。
如果文件名必须使用中文,则需要使用百分号编码格式(浏览器只认utf-8):中文.jpg转化成URLEncoder.encode("中文.jpg","utf-8")
编码以及解码 → 使用 URLEncoder编码URLDecoder解码

刷新功能

也是使用请求头来实现Refresh

response.setHeader("Refresh","1;url"),1代表的刷新秒数,url是跳转地址,可以不传,则刷新自己。
在使用HTML做页面的时候,可以使用<meta>:<meta http-equiv="refresh" content="1;url">

缓存机制

不缓存

response.setIntHeader("Expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("pragma","no-cache");

缓存

response.setDateHeader("Expires", System.currentTimeMillis() + 1000l * 3600 * 24 * 30);

重定向

利用Header来实现————请求重定向

response.setStatus(302);
response.setHeader("Location", "/Day03/index.jsp");

API方法————请求转发

response.sendRedirect("/Day03/index.jsp");

推荐使用请求转发,只请求一次服务器,请求重定向需要请求两次服务器

输出验证码图片

使用BufferedImage类来画图
贼麻烦,先不整理了

零碎知识

getOutputStream 和 getWriter 只能调用一个。

因为这两个方法都是面向缓存区,缓存区只能缓存一种数据,不能同时缓存字节流和字符流。

请求转发:

getServletContext().getRequestDispatcher("/Demo2").forward(request, response)

.JSP 文件

这个文件很像.html文件,但实际上,是个Servlet,可以使用<%=Java代码 %>来编写Java代码以及逻辑

路径分析
绝对路径:以/开头的路径,绝对路径在相对于的路径上直接拼接得到最终的路径
相对路径:不以/开头的路径,基于当前所在的路径计算得到新的路径
硬盘路径:以盘符开头的路径,是哪个路径就是那个路径

虚拟路径时,都使用绝对路径
真实路径时,都使用相对路径

获取客户端信息——通过Request

//全部URL
String url = request.getRequestURL().toString();
//资源部分
String uri = request.getRequestURI();
//请求参数
String qStr = request.getQueryString();
//请求ID
String ip = request.getRemoteAddr();
//请求方式
String type = request.getMethod();
//Web应用名称
String name = request.getContextPath();

获取请求头信息

request.getHeader("name");
request.getHeaders("name");
request.getHeaderName();
request.getIntHeader("name");
request.getDateHeader("name");

获取请求参数

//全部URL
String url = request.getRequestURL().toString();
//资源部分
String uri = request.getRequestURI();
//请求参数
String qStr = request.getQueryString();
//请求ID
String ip = request.getRemoteAddr();
//请求方式
String type = request.getMethod();
//Web应用名称
String name = request.getContextPath();

设置服务器解码格式

通知服务器 实体内容的编码格式(只对POST提交有用)

request.setcharacterEncoding("utf-8");

对于get提交,只能手动解决乱码问题

name=new String(name.getBytes("iso8859-1"),"utf-8"

利用请求域传递对象
Attribute

作用范围:整个请求链上
生命周期:当服务器接收到请求,则创建该请求的Request,当请求结束,则销毁Request
作用:在整个请求链中共享数据,通常我们在Servlet中处理好的数据,会存到Request域中,请求转发到.JSP页面来进行展示

实现 请求转发/请求包含

请求转发

request.getRequestDispatcher("url").forword(request,response);

请求包含

request.getRequestDispatcher("url").incloud(request,response);

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注