JavaWeb学习笔记-Servlet02

JavaWeb学习笔记-Servlet02

上一个文件内容太多了新开一个,今天就这样吧明天继续。


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对象学习之请求数据

请求数据:

  1. 请求行:请求方式 请求URL 协议
  1. getMethod() // 获取请求方式
  2. getRequestURL() // 获取请求URL信息
  3. getRequestURI() // 获取请求URI信息
  4. getQueryString() // 获取get请求中URL中的请求数据
  5. getScheme() // 获取请求协议
  1. 请求头
    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()获取;*还要注意判断空指针异常。

  1. 请求相关的网络信息
    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")

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.byfree.top/archives/servlet02