学习主题:Servlet
学习目标:
1 掌握 Servlet的运行流程
2 掌握Servlet的在web.xml中的配置
3 掌握Servlet的生命周期
4 掌握Servlet中doGet doPost和service方法
5 掌握Servlet重要对象request的使用
6 掌握Servlet重要对象response的使用
7 掌握如何解决乱码问题
1.Servlet的运行流程分析
(1)请完整的写出视频中在画图中Servlet创建流程?
(2)根据视频请说明请求地址localhost:8080/project/s的每个部分的作用?
******localhost:8080 根据ip和端口号可以找到对应服务器,同时服务器会去 webapps下查找处理此次请求的代码
******Project/s uri数据,服务器会根据uri找到 对应的servlet执行,去项目中 的web.xml文件中去匹配。
2.Myeclipse中启动和关闭服务器
(1)请写出Servlet的url-pattern的配置方式
配置方式一:精确配置
<url-pattern>/别名</url-pattern>
配置方式二:模糊配置
<url-pattern>*.后缀名</url-pattern>
配置方式三:拦截所有请求
<url-pattern>/*</url-pattern>
配置方式四:
<url-pattern>/one/*</url-pattern>
(2)多个servlet配置同一个url-pattern会报什么错误?
******在启动服务器的时候就会报错
3.多个servlet配置同一个url-pattern会报什么错误?
(1)为什么Servlet只会创建一个,根据视频中的讲解说出你的理解
******因为如果Servlet对象不是单例的话,服务器每次遇到请求都会创建一个Servlet对象,那么100万次请求就会创建100万个对象,浪费资源,这样对服务器的性能影响是非常大的,所以Servlet只会创建一个对象,该对象是线程共享的。
(2)请说出视频中的两个注意
配置方式一:精确配置
<url-pattern>/别名</url-pattern>
注意:
"/"是必须声明的,别名不可以为中文
此种配置方式可以配置多个
配置方式二:模糊配置
<url-pattern>*.后缀名</url-pattern>
注意:
*表示任意个数的任意字符
所有以指定的后缀名结尾的请求都会调用该servlet进行处理
作用:
进行模块化开发的划分等
配置方式三:拦截所有请求
<url-pattern>/*</url-pattern>
注意:
会拦截所有类型的请求,包括静态资源请求(css、js、图片等)和jsp请求。
配置方式四:
<url-pattern>/one/*</url-pattern>
注意:
会拦截处理所有Servlet的别名以one开头的路径的请求
注意:
一个Servlet可以配置多个url-pattern
不同的Servlet不允许配置相同的url-pattern,如果配置 了在服务器启动的时候就会报错。
服务器启动的时候就会将部署的项目中的web.xml文件加载进内存。
4.Servlet的生命周期
(1)请求说出Servlet的生命周期
***结论:
******从第一次被调用到服务器关闭
***验证:
******init方法:servlet被初始化创建的时候调用
******servlet方式:处理请求的时候
******destory方法:servlet被销毁的时候
******当服务器关闭的时候销毁servlet,触发destory方法的执行
***注意:
******我们可以在web.xml中配置load-on-startup来设置Servlet的加载时机 为服务器启动生命周期就变为从服务器开启到服务器关闭
(2)init方法,service方法,destory方法的调用时机
***init方法:servlet被初始化创建的时候调用
***servlet方式:处理请求的时候
***destory方法:servlet被销毁的时候
***当服务器关闭的时候销毁servlet,触发destory方法的执行
5.doGet和doPost和Service方法的区别
(1)请简述doGet、doPost和service方法的区别
******doGet(HttpServletRequest req, HttpServletResponse resp)
***特点:
******处理get方式的请求。
******doPost(HttpServletRequest req, HttpServletResponse resp)
***特点:
******处理post方式的请求
******service(HttpServletRequest req, HttpServletResponse resp)
***特点:
******无论是什么类型的请求方式,服务器都会优先执行service方法。
***注意:
******tomcat服务器其实只认识service方法,如果我们自己声明的servlet中没有覆写service方法,则会执行HttpServlet中的service方法,而HttpServlet中的service方法会根据请求方法调用对应的doXX()方法执行请求处理。
(2)什么情况下会出现405异常
******servlet中没有声明service方法,会根据请求方式调用对应的方法进行请求处理,
如果在servlet中没有声明对应的请求处理方法,则会报405错误。
6.doGet和doPost和service方法调用的本质
(1)请将视频中的注意总结写出来。
***1、servlet中没有声明service方法,会根据请求方式调用对应的方法进行请求 处理,如果在servlet中没有声明对应的请求处理方法,则会报405错误。
***2、tomcat服务器其实只认识service方法,如果我们自己声明的servlet中没 有覆写service方法,则会执行HttpServlet中的
*** 3、service方法,而HttpServlet中的service方法会根据请求方法调用对应的doXX()方法执行请求处理。
7.Servlet常见异常总结
(1)请说明404的原因。
***404错误:资源未找到
******原因一:在请求地址中的servlet的别名中书写错误
******原因二:虚拟项目名称拼写错误
(2)请说明500错误的原因
***500错误;内部服务器错误
******错误:java.lang.ClassNotFoundException:com.bjsxt.servlet.ServletMothod
******解决:在web.xml中校验servlet类的全限路径是否拼写错误
******错误:因为service方法体的代码执行错误导致
******解决:根据错误提示对service方法体中的代码进行错误更改。
(3)请求说明405的原因
***405错误:请求方法不支持
******原因:请求方式和servlet中的方法不匹配所造成的。
******解决:尽量使用service方法进行请求处理,并且不要在service方法中调用父类的service.
8.HTTPServletRequest的介绍和特点
(1)request对象的作用是什么。
***存储请求数据
(2)request对象的特点是什么?
***一次请求创建一个request对象,生命周期为一次请求内,请求结束即 销毁此次请求的request对象。
(3)request对象是由谁创建的?
***request对象由服务器创建
9.request获取请求行数据和根据键名获取请求头数据
(1)请说出request对象获取请求行的方法及其作用
//获取请求行信息
//获取请求方式
String method=req.getMethod();
System.out.println("请求方式:"+method);
//获取请求URL信息
StringBuffer requestURL=req.getRequestURL();
System.out.println("请求URL:"+requestURL.toString());
//获取请求URI信息
String requestURI=req.getRequestURI();
System.out.println("请求URI:"+requestURI);
//获取get请求URL中的请求数据
String queryString=req.getQueryString();
System.out.println("获取get请求URL中的数据:"+queryString);
//获取协议
String scheme = req.getScheme();
System.out.println("获取请求协议:"+scheme);
(2)getHeader方法的作用及特点
***getHeader(String name)根据键名获取请求头信息
***注意:如果获取的请求头信息不存在返回null
10.request获取请求头键名枚举和根据键名获取实体数据和获取同名不同值数据
(1)简要说明getHeaderNames的作用?
***getHeaderNames() 返回存储了请求头键名的枚举集合
(2)获取请求实体数据的方法是?区别是?
***getParameter(String name)根据键名获取数
键名其实就是前端页面中的表单标签的name属性的值或者前端页面其他方式提交数据的键的名字,如果请求中没有对应的请求数据,则返回null
***getParameterValues(String name)根据键名获取同名不同的值,返回 数组,如果没有对应的键名,则返回null
***getParameterNames() 返回实体数据中键名的枚举
11.request获取请求实体键名枚举和获取请求相关网络数据
(1)请列举获取网络信息的方法是哪些及其作用
getRemoteAddr() 获取客户端的IP地址
getRemotePort() 获取客户端端口号
getLocalAddr() 获取服务器端的ip
getLocalPort() 获取服务器端的端口号
(2)请说名getParameterNames的作用是什么,以及需要注意什么?
***getParameterNames() 返回实体数据中键名的枚举
12.response设置响应行和设置响应头
(1)说明addHeader和setHeader的方法的作用和区别
***addHeader(String name,String value)添加响应头信息,同名数据不会覆盖
***setHeader(String name,String value)设置响应头信息,会覆盖原有信息,如果没有此响应头则添加该信息
(2)说明sendError的作用
***resp.sendError(int status);
***作用:可以自主的响应状态给浏览器
13.response设置响应实体
*** 设置响应行:协议 状态码 状态消息
******resp.sendError(int status);
***作用:可以自主的响应状态给浏览器
*** 设置响应头
***addHeader(String name,String value)添加响应头信息,同名数据不会 覆盖
***setHeader(String name,String value)设置响应头信息,会覆盖原有信 息,如果没有此响应头则添加该信息
*** 设置响应实体(处理结果)
***resp.getWriter().write(“实体内容”);
***注意:
******实体内容可以分开进行响应。
***注意:
******一旦使用resp对象作出了请求响应,则意味着此次请求处理完毕。服务器在 响应后将此次请求相关的req对象和resp对象销毁。
14.乱码问题解决
(1)请说明get和post请求乱码的解决方案
***post请求方式乱码:
***req.setCharacterEncoding(“utf-8”);
***get请求方式乱码解决:
***方式一:每个数据都要单独的进行转换
***String uname=req.getParameter(“uname”);
***String uname2=new String(uname.getBytes(“iso-8859-1”),“utf-8”);
***方式二:
***req.setCharacterEncoding(“utf-8”);
***在tomcat的server.xml文件中的Connector标签中增加属性:***useBodyEncodingForURI=“true”
(2)请求说明如何解决响应数据乱码
***响应乱码问题:浏览器中显示的服务器响应数据乱码 ***resp.setContentType(“text/html;charset=utf-8”);
15.简单的登录练习
(1)什么是Servlet?
***狭义的 Servlet 是指 Java 语言实现的一个接口,广义的 Servlet 是指任何实现了这个 Servlet 接口的类
(2)Servlet的特点是什么?
***运行在支持 java 的应用服务器上
***Servlet 的实现遵循了服务器能够识别的规则,也就是服务器会自动的根据请求调用对应的 servlet 进行请求处理.简单方便,可移植性强
(3)写出视频中对Servlet总结的内容
***服务器在接受到客户端的请求后,通过Servlet技术,会自动调用对应的逻辑处理请求,并响应。