Servlet
2021-10-14 10:44:14 27 举报
AI智能生成
Java web
作者其他创作
大纲/内容
Tomcat软件
(Web服务器)
(Web服务器)
HTTP
概念
Hyper Text Transfer Protocol 超文本传输协议
传输协议:定义了,客户端和服务器端通信时,发送数据的格式
传输协议:定义了,客户端和服务器端通信时,发送数据的格式
特点
1. 基于TCP/IP的高级协议
2. 默认端口号:80
3. 基于请求/响应模型的:一次请求对应一次响应
4. 无状态的:每次请求之间相互独立,不能交互数据
2. 默认端口号:80
3. 基于请求/响应模型的:一次请求对应一次响应
4. 无状态的:每次请求之间相互独立,不能交互数据
历史版本
1.0:每一次请求响应都会建立新的连接
1.1:复用连接
1.1:复用连接
请求消息数据格式
1. 请求行
行信息例子:GET /Test_war_exploded/login.html HTTP/1.1
HTTP协议有7中请求方式,常用的有2种
GET
1. 请求参数在请求行中,在url后。
2. 请求的url长度有限制的
3. 不太安全
2. 请求的url长度有限制的
3. 不太安全
POST
1. 请求参数在请求体中
2. 请求的url长度没有限制的
3. 相对安全
2. 请求的url长度没有限制的
3. 相对安全
2. 请求头:客户端浏览器告诉服务器一些信息
常见的请求头
1. User-Agent
浏览器告诉服务器,我访问你使用的浏览器版本信息
* 可以在服务器端获取该头的信息,解决浏览器的兼容性问题
* 可以在服务器端获取该头的信息,解决浏览器的兼容性问题
2. Referer:http://localhost/login.html
告诉服务器,我(当前请求)从哪里来?
* 作用:
1. 防盗链:
2. 统计工作:
* 作用:
1. 防盗链:
2. 统计工作:
3. 请求空行
空行,就是用于分割POST请求的请求头,和请求体的。
4. 请求体(正文)
封装POST请求消息的请求参数
响应消息数据格式
1. 响应行
1. 组成
协议/版本 响应状态码 状态码描述
HTTP/1.1 200 OK
HTTP/1.1 200 OK
2. 响应状态码
1. 状态码都是3位数字
2. 分类
1. 1xx:消息
服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
2. 2xx:成功
代表:200
3. 3xx:重定向
代表:302(重定向),304(访问缓存)
4. 4xx:客户端错误
404(请求路径没有对应的资源)
405:请求方式没有对应的doXxx方法
5. 5xx:服务器端错误
500(服务器内部出现异常)
2. 响应头
1. Content-Type
服务器告诉客户端本次响应体数据格式以及编码格式
content-type: text/html; charset=UTF-8
content-type: text/html; charset=UTF-8
2. Content-disposition
服务器告诉客户端以什么格式打开响应体数据
值
in-line:默认值,在当前页面内打开
attachment;filename=xxx:以附件形式打开响应体。文件下载
content-disposition:attachment;filename=xxx
3. 响应空行
4. 响应体
Response对象
原理
功能:设置响应消息
1. 设置响应行
设置状态码:setStatus(int sc)
案例:完成重定向
代码实现:
//1. 设置状态码为302
response.setStatus(302);
//2.设置响应头location
response.setHeader("location","/day15/responseDemo2");
//1. 设置状态码为302
response.setStatus(302);
//2.设置响应头location
response.setHeader("location","/day15/responseDemo2");
//简单的重定向方法 推荐
response.sendRedirect("/day15/responseDemo2");
response.sendRedirect("/day15/responseDemo2");
重定向和请求转发的区别
redirect和forward
redirect和forward
重定向的特点:redirect
1. 地址栏发生变化
2. 重定向可以访问其他站点(服务器)的资源
3. 重定向是两次请求。不能使用request对象来共享数据
1. 地址栏发生变化
2. 重定向可以访问其他站点(服务器)的资源
3. 重定向是两次请求。不能使用request对象来共享数据
转发的特点:forward
1. 转发地址栏路径不变
2. 转发只能访问当前服务器下的资源
3. 转发是一次请求,可以使用request对象来共享数据
1. 转发地址栏路径不变
2. 转发只能访问当前服务器下的资源
3. 转发是一次请求,可以使用request对象来共享数据
2. 设置响应头
设置响应头:setHeader(String name, String value)
设置响应头类型:
response.setHeader("content-type",mimeType)
response.setHeader("content-type",mimeType)
设置响应头打开方式: 附件
response.setHeader("content-disposition","attachment;filename="+filename);
response.setHeader("content-disposition","attachment;filename="+filename);
3. 设置响应体
使用步骤:
1. 获取输出流
字符输出流:PrintWriter getWriter()
这是response获取的字符流 在一次响应结束后会自动close和刷新
这是response获取的字符流 在一次响应结束后会自动close和刷新
字节输出流:ServletOutputStream getOutputStream()
2. 使用输出流,将数据输出到客户端浏览器
案例
输出字符中文乱码问题
//简单的形式,设置编码,是在获取流之前设置
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.write("你好世界");
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.write("你好世界");
输出字节中文乱码问题
response.setContentType("text/html;charset=utf-8");
ServletOutputStream sos=response.getOutputStream();
sos.write("哈哈哈哈哈".getBytes("utf-8"));
ServletOutputStream sos=response.getOutputStream();
sos.write("哈哈哈哈哈".getBytes("utf-8"));
路径分类
1. 相对路径
通过相对路径不可以确定唯一资源
* 如:./index.html
* 不以/开头,以.开头路径
* 规则:找到当前资源和目标资源之间的相对位置关系
* ./:当前目录
* ../:后退一级目录
* 不以/开头,以.开头路径
* 规则:找到当前资源和目标资源之间的相对位置关系
* ./:当前目录
* ../:后退一级目录
2. 绝对路径
* 如:http://localhost/day15/responseDemo2 /day15/responseDemo2
* 以/开头的路径
* 以/开头的路径
规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
* 建议虚拟目录动态获取:request.getContextPath()
* <a> , <form>jsp动态获取 重定向(redirect)...
给服务器使用:不需要加虚拟目录
* 请求转发路径(forward)
* 建议虚拟目录动态获取:request.getContextPath()
* <a> , <form>jsp动态获取 重定向(redirect)...
给服务器使用:不需要加虚拟目录
* 请求转发路径(forward)
案例:文件附件下载
需求
文件下载需求:
1. 页面显示超链接
2. 点击超链接后弹出下载提示框
3. 完成图片文件下载
1. 页面显示超链接
2. 点击超链接后弹出下载提示框
3. 完成图片文件下载
分析
分析:
1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框。不满足需求
2. 任何资源都必须弹出下载提示框
3. 使用响应头设置资源的打开方式:
* content-disposition:attachment;filename=xxx
1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框。不满足需求
2. 任何资源都必须弹出下载提示框
3. 使用响应头设置资源的打开方式:
* content-disposition:attachment;filename=xxx
代码
//获取文件名称
String filename=request.getParameter("filename");
ServletContext servletContext=this.getServletContext();
//找到文件服务器路径
String realPath=servletContext.getRealPath("/img/"+filename);
//文件对拷 通过文件服务器路径 将文件以字节流输入到内存 再从内存输出到客户端
FileInputStream fis=new FileInputStream(realPath);
//设置response响应头
//1 设置响应头类型 content-type
String mimeType =servletContext.getMimeType(filename);
response.setHeader("content-type",mimeType);
//2 设置响应头打开方式 content-disposition
//解决中文文件名问题
String agent=request.getHeader("user-agent");
//重新赋值中文filename
filename= DownLoadUtils.getFileName(agent,filename);
ServletOutputStream sos=response.getOutputStream();
response.setHeader("content-disposition","attachment;filename="+filename);
//文件对拷
byte[] bytes=new byte[1024*8];
int len=0;
while((len=fis.read(bytes))!=-1){
sos.write(bytes,0,len);
}
fis.close();
String filename=request.getParameter("filename");
ServletContext servletContext=this.getServletContext();
//找到文件服务器路径
String realPath=servletContext.getRealPath("/img/"+filename);
//文件对拷 通过文件服务器路径 将文件以字节流输入到内存 再从内存输出到客户端
FileInputStream fis=new FileInputStream(realPath);
//设置response响应头
//1 设置响应头类型 content-type
String mimeType =servletContext.getMimeType(filename);
response.setHeader("content-type",mimeType);
//2 设置响应头打开方式 content-disposition
//解决中文文件名问题
String agent=request.getHeader("user-agent");
//重新赋值中文filename
filename= DownLoadUtils.getFileName(agent,filename);
ServletOutputStream sos=response.getOutputStream();
response.setHeader("content-disposition","attachment;filename="+filename);
//文件对拷
byte[] bytes=new byte[1024*8];
int len=0;
while((len=fis.read(bytes))!=-1){
sos.write(bytes,0,len);
}
fis.close();
Cookie/Session对象
会话技术
1. 会话
一次会话中包含多次请求和响应。
一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
2. 功能
在一次会话的范围内的多次请求间,共享数据
两个浏览器之间不是同一次会话
3. 方式
1. 客户端会话技术:Cookie
2. 服务器端会话技术:Session
Cookie对象
1. 概念
客户端会话技术,将数据保存到客户端
2. 实现原理
基于响应头set-cookie和请求头cookie实现
3.使用步骤
1. 创建Cookie对象,绑定数据
new Cookie(String name, String value)
存储的是键与值
存储的是键与值
2. 发送Cookie对象
response.addCookie(Cookie cookie)
3. 获取Cookie,拿到数据
1.获取Cookie对象数组
Cookie[] request.getCookies()
Cookie[] request.getCookies()
2.for循环获取Cookie对象
3.通过getValue和setValue方法获取/设置value值
4. cookie的细节
1. 一次可以发送多个cookie
可以创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可
2. cookie在浏览器中的保存时间
1. 默认情况下,当浏览器关闭后,Cookie数据被销毁
2. 持久化存储setMaxAge(int seconds)
1. 正数
将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间(秒),时间到后,cookie文件自动失效
2. 负数
默认值(-1)
3. 零
删除cookie信息
setMaxAge无效问题:是浏览器设置了每次关闭浏览器清除cookie
浏览器不开关闭清除cookie
服务器响应的cookie也是浏览器关闭被销毁
浏览器不开关闭清除cookie
服务器响应的cookie也是浏览器关闭被销毁
3. cookie能不能存中文、空格、特殊字符
在tomcat 8 之前 cookie中不能直接存储中文数据。
* 需要将中文数据转码---一般采用URL编码(%E3)
* 需要将中文数据转码---一般采用URL编码(%E3)
在tomcat 8 之后,cookie支持中文数据。
特殊字符、空格还是不支持,建议使用URL编码存储,URL解码解析
str_date = URLEncoder.encode(str_date, "utf-8");//编码
str_date = URLDecoder.decode(str_date, "utf-8");//解码
特殊字符、空格还是不支持,建议使用URL编码存储,URL解码解析
str_date = URLEncoder.encode(str_date, "utf-8");//编码
str_date = URLDecoder.decode(str_date, "utf-8");//解码
4. 多个web项目中的cookie共享问题
1. 同一个(tomcat)服务器中
默认情况下cookie不能共享
setPath(String path):设置cookie的获取范围。
默认情况下,设置当前的虚拟目录 setPath("/虚拟目录")
如果要共享,则可以将path设置为"/"
默认情况下,设置当前的虚拟目录 setPath("/虚拟目录")
如果要共享,则可以将path设置为"/"
2. 不同的(tomcat)服务器间
setDomain(String path):
如果设置一级域名相同,
那么多个服务器之间cookie可以共享
如果设置一级域名相同,
那么多个服务器之间cookie可以共享
setDomain(".baidu.com")
,那么tieba.baidu.com和news.baidu.com中cookie可以共享
,那么tieba.baidu.com和news.baidu.com中cookie可以共享
5. Cookie的特点和作用
特点
1. cookie存储数据在客户端浏览器
2. 浏览器对于单个cookie 的大小有限制(4kb) 以及
对同一个域名下的总cookie数量也有限制(不同浏览器限制不同)
对同一个域名下的总cookie数量也有限制(不同浏览器限制不同)
作用
1. cookie一般用于存出少量的不太敏感的数据
2. 在不登录的情况下,完成服务器对客户端的身份识别
6. 案例:记住上一次访问时间
response.setContentType("text/html;charset=utf-8");
Cookie[] cs = request.getCookies();
Date date;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
if (cs == null || cs.length == 0) {
response.getWriter().write("<h1>您好,欢迎您首次访问</h1>");
//首次创建Cookie 并获取date值
date = new Date();
String str_date = sdf.format(date);
//URL编码并设置值
str_date = URLEncoder.encode(str_date, "utf-8");
Cookie cookie = new Cookie("lastTime", str_date);
//设置cookie str_date值保存30天
cookie.setMaxAge(60 * 60 * 24 * 30);
//响应数据
response.addCookie(cookie);
} else if (cs != null && cs.length != 0) {
for (Cookie cookie : cs) {
if ("lastTime".equals(cookie.getName())) {
//获取cookie的URL值并解码
String str_date = cookie.getValue();
str_date = URLDecoder.decode(str_date, "utf-8");
response.getWriter().write("<h1>欢迎回来,您上次访问时间为:" + str_date + "</h1>");
//重新获取date URL编码并设置值
date = new Date();
str_date = sdf.format(date);
str_date = URLEncoder.encode(str_date, "utf-8");
cookie.setValue(str_date);
//设置cookie str_date值保存30天
cookie.setMaxAge(60 * 60 * 24 * 30);
//响应数据
response.addCookie(cookie);
break;
}
}
}
}
Cookie[] cs = request.getCookies();
Date date;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
if (cs == null || cs.length == 0) {
response.getWriter().write("<h1>您好,欢迎您首次访问</h1>");
//首次创建Cookie 并获取date值
date = new Date();
String str_date = sdf.format(date);
//URL编码并设置值
str_date = URLEncoder.encode(str_date, "utf-8");
Cookie cookie = new Cookie("lastTime", str_date);
//设置cookie str_date值保存30天
cookie.setMaxAge(60 * 60 * 24 * 30);
//响应数据
response.addCookie(cookie);
} else if (cs != null && cs.length != 0) {
for (Cookie cookie : cs) {
if ("lastTime".equals(cookie.getName())) {
//获取cookie的URL值并解码
String str_date = cookie.getValue();
str_date = URLDecoder.decode(str_date, "utf-8");
response.getWriter().write("<h1>欢迎回来,您上次访问时间为:" + str_date + "</h1>");
//重新获取date URL编码并设置值
date = new Date();
str_date = sdf.format(date);
str_date = URLEncoder.encode(str_date, "utf-8");
cookie.setValue(str_date);
//设置cookie str_date值保存30天
cookie.setMaxAge(60 * 60 * 24 * 30);
//响应数据
response.addCookie(cookie);
break;
}
}
}
}
Session对象
1. 概念
服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
2. 原理
Session的实现是依赖于Cookie的
3.使用步骤
1. 获取HttpSession对象
HttpSession session = request.getSession()
2. 使用HttpSession对象
获取:Object getAttribute(String name)
设置:void setAttribute(String name, Object value)
销毁:void removeAttribute(String name)
4. 细节
1. 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
默认情况:不是
如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作
(在IDEA中只能完成钝化,无法活化)
(在IDEA中只能完成钝化,无法活化)
session的钝化:在服务器正常关闭之前,将session对象系列化到硬盘上
session的活化:在服务器启动后,将session文件转化为内存中的session对象即可
3. session什么时候被销毁?
1. 服务器关闭
2. session对象调用invalidate()
3. session默认失效时间 30分钟
选择性配置修改
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
5. session的特点
1. session用于存储一次会话的多次请求的数据,存在服务器端
2. session可以存储任意类型,任意大小的数据
6.案例:用户登陆(含验证码)
session与Cookie的区别
1. session存储数据在服务器端,Cookie在客户端
2. session没有数据大小限制,Cookie有
3. session数据安全,Cookie相对于不安全
概念
Server Applet:运行在服务器端的小程序
* Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
* 将来我们自定义一个类,实现Servlet接口,复写方法。
* Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
* 将来我们自定义一个类,实现Servlet接口,复写方法。
执行原理
1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。
3. 如果有,则在找到对应的<servlet-class>全类名
4. tomcat会将字节码文件加载进内存,并且创建其对象
5. 调用其方法
2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。
3. 如果有,则在找到对应的<servlet-class>全类名
4. tomcat会将字节码文件加载进内存,并且创建其对象
5. 调用其方法
生命周期
1. 被创建:执行init初始化方法,只执行一次
Servlet什么时候被创建?
* 默认情况下,第一次被访问时,Servlet被创建
* 可以配置执行Servlet的创建时机。
* 在<servlet>标签下配置
1. 第一次被访问时,创建
* <load-on-startup>的值为负数
2. 在服务器启动时,创建
* <load-on-startup>的值为0或正整数
* 默认情况下,第一次被访问时,Servlet被创建
* 可以配置执行Servlet的创建时机。
* 在<servlet>标签下配置
1. 第一次被访问时,创建
* <load-on-startup>的值为负数
2. 在服务器启动时,创建
* <load-on-startup>的值为0或正整数
Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
* 多个用户同时访问时,可能存在线程安全问题。
* 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值
* 多个用户同时访问时,可能存在线程安全问题。
* 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值
2. 提供服务:执行service方法,执行多次
每次访问Servlet时,Service方法都会被调用一次
3. 被销毁:执行destroy方法,只执行一次
* Servlet被销毁时执行。服务器关闭时,Servlet被销毁
* 只有服务器正常关闭时,才会执行destroy方法。
* destroy方法在Servlet被销毁之前执行,一般用于释放资源
* 只有服务器正常关闭时,才会执行destroy方法。
* destroy方法在Servlet被销毁之前执行,一般用于释放资源
Request对象
原理
1. request和response对象是由服务器创建的。我们来使用它们
2. request对象是来获取请求消息,response对象是来设置响应消息
2. request对象是来获取请求消息,response对象是来设置响应消息
request对象继承体系结构
ServletRequest -- 接口
| 继承
HttpServletRequest -- 接口
| 实现
org.apache.catalina.connector.RequestFacade 类(tomcat)
| 继承
HttpServletRequest -- 接口
| 实现
org.apache.catalina.connector.RequestFacade 类(tomcat)
功能
1. 获取请求消息数据
1. 获取请求行数据
例子:GET /day14/demo1?name=zhangsan HTTP/1.1
1. 获取请求方式:GET
String getMethod()
2. 获取虚拟目录:/day14
String getContextPath()
3. 获取Servlet路径: /demo1
String getServletPath()
4. 获取get方式请求参数:name=zhangsan
String getQueryString()
5. 获取请求URI:/day14/demo1
URI和URL的区别:
String getRequestURI(): /day14/demo1
StringBuffer getRequestURL() :http://localhost/day14/demo1
6. 获取协议及版本HTTP/1.1
String getProtocol()
7. 获取客户机的IP地址
String getRemoteAddr()
2. 获取请求头数据
通过请求头的名称获取请求头的值
String getHeader(String name)
获取所有的请求头名称
Enumeration<String> getHeaderNames()
3. 获取请求体数据
请求体:只有POST请求方式,才有请求体,
在请求体中封装了POST请求的请求参数
步骤:
在请求体中封装了POST请求的请求参数
步骤:
1. 获取流对象
BufferedReader getReader():获取字符输入流,只能操作字符数据
ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
(文件上传知识)
ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
(文件上传知识)
2. 再从流对象中拿数据
String line=null;
while((line=br.readLine())!=null){
System.out.println(line);
}
}
while((line=br.readLine())!=null){
System.out.println(line);
}
}
2. 其他功能(重点)
1. 获取请求参数通用方式
不论get还是post请求方式都可以使用下列方法来获取请求参数
1. String getParameter(String name):根据参数名称获取参数值
2. String[] getParameterValues(String name):根据参数名称获取参数值的数组
3. Enumeration<String> getParameterNames():获取所有请求的参数名称
4. Map<String,String[]> getParameterMap():获取所有参数的map集合
获取中文乱码问题
get方式:tomcat 8 已经将get方式乱码问题解决了
post方式:会乱码
解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");
post方式:会乱码
解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");
BeanUtils工具类
简化数据封装
用于封装JavaBean
用于封装JavaBean
1. JavaBean:标准的Java类
1. 要求:
1. 类必须被public修饰
2. 必须提供空参的构造器
3. 成员变量必须使用private修饰
4. 提供公共setter和getter方法
1. 类必须被public修饰
2. 必须提供空参的构造器
3. 成员变量必须使用private修饰
4. 提供公共setter和getter方法
2. 功能:封装数据
2. 概念:
成员变量: 例如 private int id; private Sting username; 等 其中的id 和 username 就是成员变量
属性: 属性表示setter 和 getter 方法截取后的产物
例:getUsername() 去掉get后 剩下的Username 然后首字母变成小写之后的 username 表示属性
例:getUsername() 去掉get后 剩下的Username 然后首字母变成小写之后的 username 表示属性
大多数情况下 属性和成员变量是相同的 这里的相同指的是变量名相同 而不是含义相同 二者是不同的两个概念
但是注意 也有不同的情况 下面给个例子 就能明确属性和成员变量的区别了
但是注意 也有不同的情况 下面给个例子 就能明确属性和成员变量的区别了
public void setHaha(String gender) { //属性值为 haha 其操作的成员变量是gender
this.gender = gender;
}
this.gender = gender;
}
3. 方法:
1. setProperty()
2. getProperty()
3. populate(Object obj , Map map)
将map集合的键值对信息,封装到对应的JavaBean对象中
该方法有异常 catch
该方法有异常 catch
代码
Map<String, String[]> map = request.getParameterMap();
User loginUser = new User();
try {
BeanUtils.populate(loginUser, map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
Map<String, String[]> map = request.getParameterMap();
User loginUser = new User();
try {
BeanUtils.populate(loginUser, map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
2. 请求转发
一种在服务器内部的资源跳转方式
步骤
1. 通过request对象获取请求转发器对象
RequestDispatcher getRequestDispatcher(String path)
2. 使用RequestDispatcher对象来进行转发
forward(ServletRequest request, ServletResponse response)
1、2步使用链式编程
request.getRequestDispatcher("/ServletDemo8B").forward(request,response);
特点
1. 浏览器地址栏路径不发生变化
2. 只能转发到当前服务器内部资源中
3. 转发是一次请求
3. 共享数据
域对象
一个有作用范围的对象,可以在范围内共享数据
request域
代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法
1. void setAttribute(String name,Object obj):存储数据
2. Object getAttitude(String name):通过键获取值
3. void removeAttribute(String name):通过键移除键值对
4. 获取ServletContext对象
1. 概念
代表整个web应用,可以和程序的容器(服务器)来通信
2. 获取
1. 通过request对象获取
request.getServletContext()
2. 通过HttpServlet类获取
我们写的servlet继承了HttpServlet
this.getServletContext()
this.getServletContext()
3. 功能
1. 获取MIME类型
在互联网通信过程中定义的一种文件数据类型
格式: 大类型/小类型 例:text/html image/jpeg
2. 域对象
共享数据
ServletContext对象范围:所有用户所有请求的数据
ServletContext对象范围:所有用户所有请求的数据
1. setAttribute(String name,Object value)
2. getAttribute(String name)
3. removeAttribute(String name)
2. getAttribute(String name)
3. removeAttribute(String name)
3. 获取文件的真实(服务器)路径
方法:String getRealPath(String path)
1. web目录下资源访问
String b = context.getRealPath("/b.txt")
2. WEB-INF目录下的资源访问
String c = context.getRealPath("/WEB-INF/c.txt")
3. src目录下的资源访问
src文件下的所有东西都将会被存放在WEB-INF下的classes文件夹中
String a = context.getRealPath("/WEB-INF/classes/a.txt")
与类加载器getResource()方法的区别
getResource只能获取src下的路径 返回的是URL类型
ClassLoader classLoader=类名.class.getClassLoader();
URL url=classLoader.getResource("a.txt");
getResource输出:
file:/E:/Project/Java_IDEA/First/out/artifacts/ResponseDemo_war_exploded/WEB-INF/classes/a.txt
getRealPath输出:
E:\Project\Java_IDEA\First\out\artifacts\ResponseDemo_war_exploded\WEB-INF\classes\a.txt
URL url=classLoader.getResource("a.txt");
getResource输出:
file:/E:/Project/Java_IDEA/First/out/artifacts/ResponseDemo_war_exploded/WEB-INF/classes/a.txt
getRealPath输出:
E:\Project\Java_IDEA\First\out\artifacts\ResponseDemo_war_exploded\WEB-INF\classes\a.txt
链式编程写法:
类名.class.getClassLoader().getResource("a.txt")
类名.class.getClassLoader().getResource("a.txt")
0 条评论
下一页