Servlet请求路径
具体请求路径:(常用这种,其他的架构师常用)
浏览器请求的地址与当前Servlet中的<url-pattern>中内容完全一致
以'/'开头
前置请求路径:
<url-pattern>/abc/*</url-pattern>(例子)
'*'是一个通配符,表任意长度字符串
后置请求路径:
<url-pattern>*.do</url-pattern>(例子)
通配符请求路径:
<url-pattern>/*</url-pattern>(所有网址都可访问)
请求路径优先级:具体>前置>通配符>后置
Servlet实例对象的生命周期
- 项目中所有的Servlet实例对象都由tomcat负责创建,开发人员无权创建
-
创建时机:
- 默认情况下,第一次访问时,tomcat创建实例对象
- 人工干预,在tomcat启动的时候创建.在配置文件中的Servlet标签中加入load-on-startup标签,里面放一个大于0的整数就行
- 在tomcat运行期间,一个Servlet实现类只能被创建一个实例对象
- 在tomcat关闭时,由tomcat负责销毁所有Servlet实例对象
Servlet开发时使用的五种工具对象
- HttpServletResponse接口:负责将运行结果写入到响应包
- HttpServletRequest接口:读取请求协议包信息
- ServletContext接口:可为当前网站中的所有Servlet提供共享数据
- Cookie:在一次会话过程中,存储浏览器在服务端产生的私人数据
- HttpSession接口:在一次会话过程中,存储浏览器在服务端产生的私人数据
HttpServletResponse接口:
1. 来自Servlet规范中的接口,实现类由tomcat负责提供
2. 其修饰的对象一般称为"响应对象"
3. 将相关数据写入到响应头和响应体
如何将"英文字符串"写入到响应体
String str="hello";
从响应对象获得一个"输出流"
PrintWriter out =Response.getWriter();
out.write(str);
如果将字符串替换成int 50呢?网页结果是2.
out.write()方法只能将"字符串"或"unicode码"写入到响应体
值为50的unicode码对应的字符串"2"
此时换用print()方法.可将任意类型数据写入到响应体中并保持原有类型
String str="明天休息";
out.write(str);
结果显示乱码
浏览器是根据响应头中设置的字符集对接收内容进行解码
在默认情况下响应头的字符集为ISO-8859-1
在获得输出流之前设置响应头中字符集
String str="下课休息";
response.setCharacterEncoding("GBK");
response.getWriter().writer(str);
String str="apple<br/>oranger<br/>egg";
一般浏览器默认情况下响应头中[内容类型]是test
设置响应头内容类型
response.setcontentType("text/html;charset=GBK");
写一个Servlet用来通过JDBC查询表,并把表信息写入到响应体中
HttpServletRequest接口:
其修饰对象request,称为响应对象.可读取请求协议包相关信息,类似于Scanner
request.getRequestURL();获取请求地址
request.getMethod();获取请求方法
request.getParameterNames();获取请求头(体)中的请求参数名
request.getParameter("请求参数名");返回一个字符串(单个请求参数)
request.getParameterValues("请求参数名");返回一个数组(多个同名参数)复选框作为参数时
请求对象和响应对象的生命周期
- 每当Tomcat收到一个请求协议包时,会为其创建一对请求对象和响应对象
- 一次请求对应一对请求对象和响应对象
- Servlet被请求时,Tomcat将两个对象作为参数传入到服务方法中(doGet/doPost)
- 服务方法工作完毕后,Tomcat负责销毁两个对象
- Tomcat负责将响应包推送到浏览器上
当浏览器以Get方式发送请求时,请求参数存放在请求头,在请求协议包到达服务端时,请求头的内容由Tomcat解析,Tomcat9.0在解析数据时,默认采用的字符集是utf-8.此时浏览器发送的中文参数不会再服务端出现乱码问题
以Post方式发送请求时,请求参数存放在请求体中,到达服务端时由对应的请求对象负责解析,request对象默认使用ISO-8859-1字符集,此时请求出现中文字符会出现乱码问题
方案:在request对象解析数据前,重新设置使用字符集
request.setCharacterEncoding("utf-8");
String value=request.getParameter("参数");
ServletContext接口
1.servlet规范中的一个接口,接口实现类由Tomcat负责提供
2.为当前工程中的所有servlet提供共享数据
3.习惯将其修饰对象称为全局作用域对象
在Tomcat启动时, 由其创建全局作用域对象,一个网站只能有一个全局作用域对象,当网站关闭时,由Tomcat负责销毁
向Tomcat索要当前工程的全局作用域对象
ServletContext application = request.getServletContext();
共享数据的来源
1.开发人员添加到web.xml中
<context-param>
<param-name>共享数据名称</param-name>
<param-value>共享数据内容</param-value>
</context-patam>
共享数据内容=application.getInitParameter("共享数据名称");
此时共享数据只能读取,不能修改.
2.由某个servlet将数据写入全局作用域对象中,其他servlet可以使用
写入:application.serAttribute("共享数据名",共享数据内容); 数据可任意类型
获取:application.getAttribute("共享数据名");
此时servlet的数据可以被修改,同样使用setAttribute将共享数据名覆盖即可
会话
浏览器和服务端一次完整的交流
特点:
1. 一次会话经历多次请求和响应
2. 一次会话访问多个不同的servlet
cookie 和 HttpSession
Cookie
是servlet规范提供的一个工具类
在参与一次会话的servlet之间实现数据共享
Cookie存储在浏览器上,保存本次会话的共享数据
原理:(A和B均代表不同的servlet)
浏览器访问A时,A负责将数据保存到cookie,再有response响应到浏览器,当浏览器再访问B时,需要无条件将已存在的cookie推送给B,这样A和B之间就实现了数据共享
Cookie的使用:一个cookie只能存储一个键值对,并只能存储String类型数据
创建
Cookie c1=new Cookie("key","value");
写入
response.addCookie(c1);
读取
Cookie array[]=request.getCookies();
cookie.getName();读取关键字
cookie.getValue();读取数据内容
生命周期:
cookie是存储在浏览器中的,所以一般情况下,浏览器关闭时,cookie会被销毁
人工干预存活时间:
cookie.setMaxAge(以秒为单位);设定cookie在硬盘上存活的时间
HttpSession
来自servlet规范的一个接口,实现类来自Tomcat
其修饰对象为会话作用域对象,或session对象
与cookie的区别:
cookie存储在客户端的浏览器或硬盘当中,
session存储在服务端的内存中
cookie只能存储String数据
session可以存储任意类型的数据
一个cookie只能存储一个键值对
一个session可以存储任意数量的键值对
使用:
浏览器来访时,Tomcat不会主动创建相应的HttpSession对象,需要servlet提出要求
HttpSession session=request.getSession();
HttpSession session=request.getSession(true);
若当前浏览器在服务端已有一个session对象,Tomcat将此session返回,若没有则新建一个session对象返回(如来访用户身份已得到确认)
HttpSession session=request.getSession(false);
若有则返回,若没有则返回null(当用户身份未得到确认)
session.setAttribute("key",共享数据);
session.getAttribute("key");
原理:
在Tomcat创建了一个SESSION对象时,为SESSION对象生成一个唯一编号然后将这个编号保存到cookie中,推送到当前的浏览器内存中
等到浏览器再次发送请求时,Tomcat就可以通过读取浏览器返回的cookie来判断浏览器在服务端中是否有session对象
Http状态码
Http状态码通知浏览器在收到响应包之后的行为,及告知浏览器,服务端无法提供本次服务的原因
1xx:通知浏览器本次返回资源文件并不完整,需要浏览器向服务端再次发送请求
2xx:传送文件完整
200:正常状态码,浏览器和服务端进行了一次完美的通信
3xx:服务器给浏览器推送的是一个网址,浏览器在接收到该网址后要立刻向该网址发送请求
response.sendRedirect("地址");
4xx:通知浏览器,服务端无法提供本次服务的原因,是由于服务端没有相应资源
400:服务端没有相应的资源
405:服务端有处理本次请求的servlet,但该servlet不支持当前浏览器的请求方式.如浏览器已get方式请求服务端,但相应servlet没有重写doGet方法.
5xx:通知浏览器,服务端未能提供本次服务的原因,是被调用servlet在运行时出现了异常
默认欢迎资源文件
浏览器向服务器发送了默认请求,没有指定索要的文件的时候
http://localhose/555
手动在web.xml配置
<welcome-file-list>
<welcome-file>one.html</welcome-file>
</welcome-file-list>
当web.xml文件中没有的时候
Tomcat回到自己的config文件下有个web.xml文件,里面写的有默认的文件名
多个servlet来处理一次请求方案
1.重定向方案
在第一个servlet工作完毕后,将第二个servlet的地址发给浏览器,浏览器自动请求第二个servlet
response.sendRedirect(第二个servlet的地址)
发生位置:客户端浏览器上,请求多次,地址栏内容会发生改变,请求方式一定是get,可访问内网和外网的资源
适用场景:添加,删除,更新后调用查询功能
2.请求转发方案
第一个servlet工作完毕后,代替浏览器向Tomcat申请调用第二个servlet
1.创建一个资源申请报告对象
RequestDispatcher report=request.getRequestDispatcher("第二个servlet的地址")
2.将申请报告推送给Tomcat,并将第一个servlet的response和request一并发送
report.forward(request,response)
请求转发时为什么将第一个Servelt中request和response交给Tomcat:
Tomcat在调用第二个Serelt时需要为其提供运行时需要【request】和【response】
但是,本次请求是由第一个Servelt来发送的,没有对应的【请求协议包】
因此导致Tomcat在接受到请求后,不会创建【request】和【response】,
为了解决这个问题,需要将第一个Servlet的request和response交给第二个Servlet来使用。
发生位置在服务端,浏览器只向服务器发送了一次请求,只能访问内部的资源,请求方式始终和第一个servlet保持一致
适用于查询servlet调用jsp
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。