上一个文件内容太多了新开一个,今天就这样吧明天继续。
2/3/2020
第四节:web.xml文件的几种配置方式
配置方式一:精确配置
<url-pattern>/别名</url-pattern>
注意:"/"是必须声明的,别名不可以为中文此种配置方式可以配置多个
<servlet>
<servlet-name>my</servlet-name>
<servlet-class>com.yjb.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>my</servlet-name>
<url-pattern>/s</url-pattern>
<url-pattern>/c</url-pattern>
</servlet-mapping>
配置方式二:模糊配置
<url-pattern>*.后缀名</url-pattern>
注意:所有以指定的后缀名结尾的请求都会调用该servlet进行处理作用;
进行模块化开发的划分等
<servlet>
<servlet-name>my</servlet-name>
<servlet-class>com.yjb.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>my</servlet-name>
<!--配置方式一-->
<url-pattern>/s</url-pattern>
<url-pattern>/c</url-pattern>
<!--配置方式二-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
配置方式三:拦截所有请求
<url-pattern>/*</url-pattern>
所有的请求都会执行这个servlet,很少使用。
注意:会拦截所有的请求,包括静态资源请求(css、js、图片等)和jsp请求。
<servlet>
<servlet-name>my</servlet-name>
<servlet-class>com.yjb.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>my</servlet-name>
<!--配置方式三-->
<url-pattern>/*</url-pattern>
</servlet-mapping>
配置方式四:
<url-pattern>/one/*</url-pattern>
注意:会拦截处理所有Servlet的别名以ont开头的路径请求
<servlet>
<servlet-name>my</servlet-name>
<servlet-class>com.yjb.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>my</servlet-name>
<!--配置方式四-->
<url-pattern>/one/*</url-pattern>
</servlet-mapping>
总结
一个Servlet可以配置多个url-pattern
不同的Servlet不允许配置相同url-pattern,如果配置了在服务器启动的时候就会报错
服务器启动的时候就会将部署的项目中的web.xml文件加载进内存
第五节:Servlet的生命周期
结论:
从第一次被调用到服务器关闭
验证:
init方法:servlet被初始化创建的时候调用
service方法:处理请求的时候
destory方法:servlet被销毁的时候
当服务器关闭的时候销毁servlet触发destoy方法的执行
让服务器启动的时候完成加载和初始化创建:
<load-on-startup>1</load-on-startup>
这个1代表的是启动顺序
<servlet>
<servlet-name>my</servlet-name>
<servlet-class>com.yjb.servlet.MyServlet</servlet-class>
<load-on-startup>1</load-on-startup><!--配置-->
</servlet>
配置好后服务器启动时调用init方法。
第六节:doGet和doPost和Service方法的区别
doGet
特点:处理get方式的请求
doPost
特点:处理Post方式的请求
注意
Servlet没有声明service方法,会根据请求方式调用对应的方法进行处理
如果在servlet中没有声明对应的请求方法会报405错误
底层机制
tomcat服务器其实只认识service方法,如果我们自己声明的servlet中没有重写service方法,则会执行HttpServlet中的service方法,而HttpServlet中的service方法会根据请求方法调用对应的doxx()方法执行请求处理。
Servlet常见错误总结
404错误:资源未找到
原因一:在请求地址中的servlet的别名书写错误
原因二:虚拟项目名称拼写错误
500错误:内部服务器错误
错误一:java.lang.ClassNotFoundException:xxxxxxxxxxxxx
解决:检查web.xml中的servlet类的全限定路径是否拼写错误
错误二:因为service方法的代码执行错误导致
解决:根据错误提示对service方法体中的代码进行错误更改
405错误:请求方式不支持
原因:请求方式和servlet中的方法不匹配造成的
解决:尽量使用service方法进行请求处理,并且不要在service方法中调用父类的service方法。
第七节:HTTPServletRequest/Response
Request对象介绍:
服务器在接收到请求后,会给此次请求创建一个Ruquest对象,此对象中封存了此次请求相关的的数据
作用:存储请求数据
注意:每次请求都会创建新的request对象存储请求数据
特点:
request对象由服务器创建
一次请求创建一个request对象
生命周期为一次请求内,请求结束即销毁此次请求的request对象
service方法
request对象学习之请求数据
请求数据:
- 请求行:请求方式 请求URL 协议
- getMethod() // 获取请求方式
- getRequestURL() // 获取请求URL信息
- getRequestURI() // 获取请求URI信息
- getQueryString() // 获取get请求中URL中的请求数据
- getScheme() // 获取请求协议
- 请求头
getHeader(String) // 根据键名获取请求头信息
注意:如果请求的键名不存在则返回null而不是报错
获取请求头中的键名的枚举
Enumeration<String> headerNames = req.getHeaderNames();
while (headerNames.hasMoreElements()) {
System.out.println(headerNames.nextElement());
}
获取键值直接在遍历键名时使用getHEader就可以了
3. 请求实体
根据键名获取数据
getParameter()
String uname = req.getParameter("uname");
String pwd = req.getParameter("pwd");
System.out.println(uname + pwd);
获取同名不同值的实体数据
String[] favs = req.getParameterValues("fav");
for (String s : favs) {
System.out.println("favs->" + s);
}
注意favs可能是null,这本身没有错误,但是遍历的时候就有问题了。
获取请求实体中键名的枚举
getParameterNames();
遍历枚举
Enumeration names = req.getParameterNames();
for (name.hasMoreElements()) {
String name = (String) names.nextElements();
if ("fav".equals(name)) {
String[] favs = req.getParameterValues("fav");
if (favs != null){
for (String s : favs) {
System.out.println("favs->" + s);
}
}
}
String value = req.getParameter(name);
system.out.println(name + ":" + value)
}
因为在遍历枚举时里面还会有同名不同值的数据所以还要判断一下,再使用getParameterValues()获取;*还要注意判断空指针异常。
- 请求相关的网络信息
getRemoteAddr() // 获取客户端IP
getRemotePort() // 获取客户端的端口号
getLocalAddr() // 获取服务器ip
getLocalPort() // 获取服务器端口号
3/3/2020
response对象响应处理结果
1. 设置响应行:协议 状态码 状态消息
自定义响应404异常
sendError(404) // 自定义404异常
作用:自主响应状态给浏览器
2. 设置响应头
添加响应头信息
addHeader("mouse", "thinkpad")
设置相应头
setHeader("Content-Length","20")
注意:addHeader添加响应头原来有也会继续添加
setHeader原来有就设置,没有就添加一个
3. 设置响应实体:处理结果
getWriter().write() // 返回的是一个IO流所以可以使用write方法写如字符串
乱码问题
请求乱码:服务器获取的请求数据乱码
post请求方式乱码
设置请求编码格式:
getCharacterEncoding("utf-8")
get请求方式:
方式一:每个数据都要单独进行转换
String uname = req.getParameter("uname");
String uname2 = new String(uname.getBytes("iso-8859-1"), "utf-8");
方式二:
getCharacterEncoding("utf-8")
在tomcat的server.xml文件中的Connector标签中增加属性:useBodyEncodingForURI="true"
响应乱码问题:浏览器中显示的服务器相应数据乱码
设置相应编码格式
res.setContentType("text/html;charset=utf-8")
Q.E.D.