目录
-
什么是Servlet
-
Servlet是JavaEE规范(接口)之一
-
Servlet是javaWEB三大组件之一。三大组件是Servlet程序、Filter过滤器、Listener监听器
-
Servlet是运行在服务器上的一个Java小程序,最重要的作用是可以接受客户端发送过来的请求,并响应数据给客户端
-
-
手动实现Servlet程序
-
编写一个类去实现Servlet接口
-
实现servlet接口方法,处理请求,并响应数据
-
到web.xml中配置Servlet程序的访问地址(web-app标签内配置如下)
-
<!--配程序:servlet标签给Tomcat配置servlet程序-->
<servlet>
<!--servlet-name标签是给servlet起一个别名(一般是类名)-->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class标签是servlet程序的全类名-->
<servlet-class>com.atguigu.servlet.HelloServlet</servlet-class>
</servlet>
<!--配地址:servlet-mapping标签给servlet程序配置访问地址-->
<servlet-mapping>
<!--servlet-name标签告诉服务器当前在给哪个servlet程序配地址-->
<servlet-name>HelloServlet</servlet-name>
<!--
url-pattern标签配置访问地址
/ 表示在服务器解析的时候,表示地址为http://ip:port/工程路径(好像到默认情况下index.jsp的父目录)
/hello 表示地址为//ip:port/工程路径/hello
访问该路径就会访问servlet
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
-
备注:url-pattern标签中的“/”表示的是idea中的“编辑配置 | Deployment | 下面的Application context中的地址
-
Application context中的地址需要与server中的URL一起修改(要一致)
-
常见的错误(后面会强调:约定大于配置)
-
<url-pattern>
-
url-pattern中配置的路径没有以斜杠开头
-
-
servlet-name配置的值存在
-
0
-
-
-
如何通过url地址定位访问到servlet程序
-
Servlet的生命周期
-
总共有四个函数
-
构造方法:执行servlet构造方法
-
init:执行init初始化方法
-
servict:执行servict方法
-
destroy:执行destroy销毁方法
-
-
生命周期
-
构造方法和init方法:在第一次访问创建servlet程序时调用
-
servict方法:每次访问都会调用
-
destroy方法:web工程停止时访问
-
-
-
请求的分发处理
-
个人理解是根据请求方式的不同,进行不同的操作
-
重写service方法时,使用getMethod方法获取请求的方式
-
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
// 类型转换,因为HttpServletRequest有getMethod方法,该方法可以获取请求的方式
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
//getMethod方法可以获取请求的方式
String method = httpServletRequest.getMethod();
if("GET".equals(method)){
System.out.println("get请求");
}else if("POST".equals(method)){
System.out.println("post请求");
}
}
-
通过HttpServlet类实现Servlet程序
-
一般在实际开发中,都是使用继承HttpServlet类去实现Servler程序的
-
步骤:
-
编写一个类去继承HttpServlet类
-
根据业务需要重写doGet或doPost方法
-
到web.xml中配置Servlet程序的访问路径
-
-
-
IDEA菜单生成Servlet程序
-
即自动生成HttpServlet的继承类
-
点击步骤
-
右击所要存放类的目录 | NEW(新建) | Create New Servlet | 填写三个框:类名(Servlet-name)、(所在包)包名、全类名 | 取消Create Java EE 6 annotated class的勾选 | 点击OK
-
-
-
Servlet类的继承体系
-
ServletConfig类
-
ServletConfig类是Servlet程序的配置信息类
-
Servlet程序和ServletConfig对象都是Tomcat负责创建,我们负责使用
-
Servlet程序默认是第一次访问的时候创建,ServletConfig是每个servlet程序创建的时候都会创建一个对应的servletConfig对象
-
ServletConfig类有三大作用
-
可以获取Servlet程序的别名:servlet-name的值
-
获取初始化参数init-param
-
获取ServletContext对象
-
-
-
ServletContext类
-
ServletContext是一个接口,它表示Servlet上下文对象
-
一个web工程,只有一个ServletContext对象实例
-
ServletContext对象是一个域对象
-
ServletContext是在web工程部署的时候创建,在工程结束的时候销毁
-
域对象:
-
域对象是可以像Map一样存取数据的对象
-
这里的域对象指的是存取数据的操作范围
-
操作范围是整个工程
-
-
|
存数据 |
取数据 |
删除数据 |
Map |
put() |
get() |
remove() |
域对象 |
setAttribute() |
getAttribute() |
removeAttribute() |
-
ServletContext类的四个作用
-
获取web.xml中配置的上下文参数context-param
-
获取当前的工程路径,格式:/工程路径
-
获取工程部署后在服务器硬盘上的绝对路径,也可以获取其他资源的路径(可以通过获取路径来在目录下创建文件)
-
像Map一样存取数据
-
-
HttpServletRequest类
-
HttpServletRequest类的作用
-
每次只要有请求进入Tomcat服务器,tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。然后传递到service方法(doGet和doPost)中给我们使用。我们通过HttpServletRequest对象可以获取到所有请求的信息
-
-
常用方法
-
getRequesURI() 获取请求的资源路径
-
getRequesURL() 获取请求的统一资源定位符(绝对路径)
-
getRemoteHost() 获取客户端的ip地址
-
getHeader() 获取请求头
-
getParameter() 获取请求的参数
-
getParameterValues() 获取请求的参数(多个值的时候使用)
-
getMethod() 获取请求方式(GET、POST)
-
setAttribute(key, value) 获取域数据
-
getAttribute(key) 获取域数据
-
getRequestDispatcher() 获取请求转发对象
-
setCharacterEncoding() 设置请求体的字符集
-
-
-
解决post请求中文乱码问题
-
setCharacterEncoding()方法
-
// 设置请求体的字符集为utf-8,从而解决post请求的中文乱码问题(注意:需要在获取请求之前调用该方法才有效)
req.setCharacterEncoding("UTF-8");
-
无论是发送请求还是获取请求的数据都可以使用该方法来设置字符集,避免乱码
-
请求的转发
-
请求转发是指服务器收到请求后从一个服务器资源跳到另一个资源
-
请求转发的特点:
-
浏览器地址栏没有变化
-
他们是一次请求
-
他们共享Request域中的数据
-
可以转发到WEB-INF目录下
-
不可以访问工程之外的资源
-
-
base标签
-
作用:base标签设置页面相对路径工作时参照的地址
-
所有相对路径在工作的时候会默认参照当前浏览器地址栏中的地址来进行跳转。如果进行了转发,那么地址栏上的地址没有改变,那么相对路径就会指向错误的资源,就会造成路径出错。所以可以用base标签来设置页面相对路径工作时参照的地址,而不是参照浏览器地址栏上的地址
-
<head>
<base href="http://localhost:8080/07_servlet/a/b/c.html" ><!--c.html可以省略,但是最后的”/“不能省-->
</head>
-
HttpServletResponse类
-
作用:
-
HttpServletResponse类和HttpServletRequest类一样,每次请求到来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用。HttpServletRequest表示请求过来的信息;HttpServletResponse表示所有响应的信息
-
我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象进行设置
-
-
字节流和字符流
-
两种流
-
字节流 getOutputStream(); 常用于下载(传递二进制数据)
-
字符流 getWriter(); 常用于回传字符串(常用)
-
-
注意两个流在同一时间只能使用一个。使用了字节流就不能再使用字符流,反之亦然。否则会报错
-
-
同时开启两种流会报错
-
-
往客户端(浏览器)传数据
// 要求:往客户端回传数据
PrintWriter writer = resp.getWriter();
writer.write("爪哇咖啡"); // 字符串会在浏览器中显示
-
解决响应时中文乱码问题
-
方案一:分别设置编码
-
默认的字符集是ISO-8859-1,该字符集不支持中文
-
需要修改响应的字符集为UTF-8,同时也要修改浏览器的字符集为UTF-8。(字符集不一致也会出现乱码)
-
注意:需要获取流对象之前才会起作用,比如上面的往客户端传数据代码之前
-
-
// 设置字符集,让其支持中文
resp.setCharacterEncoding("UTF-8");
// 通过响应头设置浏览器也使用UTF-8字符集
resp.setHeader("Content-Type", "text/html;charset=UTF-8");
-
方案二:统一设置编码
-
同时设置服务器和客户端所使用的字符集为UTF-8,还设置了响应头
-
// 同时设置服务器和客户端所使用的字符集为UTF-8,还设置了响应头
resp.setContentType("text/html;charset=UTF-8");
-
请求重定向
-
代码是07中的Response1和Response2 (我写的啥,看不懂了???好像没有把代码弄上来呀)
-
请求重定向是指客户端给服务器发请求,然后服务器给客户端一个新的地址,客户端会自动跳转这个新的地址。(因为之前的地址可能已经被废弃)
-
请求重定向的特点:
-
地址栏有变化,地址会变为新地址
-
两次请求
-
不共享Request域中的数据
-
不能访问WEB-INF下的资源
-
可以访问资源外的资源
-
-
请求重定向的两种方法
-
方法一:
-
// 设置响应状态码302,表示重定向
resp.setStatus(302);
// 设置响应头,说明新的地址
resp.setHeader("Location","Http://localhost:8080/07_servlet/response2");
-
方法二(推荐):
-
………………(我干嘛去了,怎么没有做笔记,吐了呀)
-