Servlet概述
Servlet 是运行在 Web 服务器中的小型 Java 程序。Servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。
Servlet实现
1. 定义类,实现servlet接口或者继承GenericServlet或者继承HTTPServlet
2. 在web.xml中针对实现的servlet进行配置
3. 浏览器上访问servlet
Servlet :接口
|
GenericServlet :通用的Servlet
|
HttpServlet :HttpServlet
实现servlet接口
public class ServletDemo1 implements Servlet{
@Override
/**
* 为用户处理请求和响应的方法.
*/
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
res.getWriter().println("Hello Servlet...");
}
...
}
web.xml中配置servlet
访问servlet
http://localhost:8080/demo/ServletDemo1
Servlet生命周期
Servlet生命周期:Servlet程序从创建到销毁的过程
1:init方法创建Servlet
2: 调用service方法启动服务
3: 关闭服务,destroy方法
ServletConfig
ServletConfig是servlet 容器使用的 servlet 配置对象,该对象在初始化期间将信息传递给servlet。
API
String getInitParameter(String name)
返回根据web.xml中配置的参数名获取参数值
Enumeration getInitParameterNames()
获取配置的所有参数名称,返回为一个Enumeration对象
String getServletName()
获取Servlet名称
ServletContext getServletContext()
返回一个ServletContext对象用于服务器和Servlet程序之间交互时使用的对象,该对象
在服务器启动时就存在
Tomcat7接收数据乱码
req.getParameter(“name”).getBytes(“ISO-8859-1”);
HttpServletResponse
HttpServletResponse是ServletResponse接口的子接口,表示HTTP协议的响应对象。既然HttpServletResPonse是HTTP的响应对象,那么该接口中包含了针对各自请求进行响应的方法。响应无非就是将数据输出到客户端,在IO中流的输出无非就是两种:字节输出流和字符输出流。
Servlet实现
Servlet :接口
|
GenericServlet :通用的Servlet
|
HttpServlet :HttpServlet
Servlet的注解:
修改web.xml中metadata-complete修改为false
@WebServlet("/路径")
web.xml中配置servlet
WEB不同之间传值:
1.GET方式提交数据
ip:端口/项目名/访问路径?参数=值&参数2=值
自定义GET方式去提交数据
2.Cookie:浏览器上的
一个服务器最多在浏览器上能存储20个
浏览器总共能存储300个cookie
cookie中不能存储对象,只能存储字符串,而且中文字符串不能直接被存储
URLEncoder.encode(数据,UTF-8)
URLDecoder.decode(数据,UTF-8)
cookie定义一个路径和名称:
1.浏览器中根据路径和名称来确定cookie文件是否是一个
2.在代码中读取cookie的数据的时,根据cookie定义的路径决定的
/项目名/ServletA
/项目名
需求:给浏览器添加一个cookie
问题:cookie是在浏览器,添加的代码在服务器
响应对象
需求:从浏览器中读取cookie的数据
请求对象.getCookies,返回一个Cookie[]
获取cookie的信息【名称、路径、值】
Cookie再总结一次
Servlet功能
1.servlet三大职责(每次写Servlet的时间都要先想一下这三大职责)
①:接收与封装参数
②:处理业务(一些会去调用service层)
③:跳转页面(最后都会跳转到jsp页面显示数据)
2.什么我们需要跳转与数据共享 ★★★
跳转:需要做责任分离(Servlet擅长写代码,jsp擅长展示页面)
共享:http是无状态的,我们跳转的时候数据无法保存下来.因此需要做数据共享
3.Servlet跳转的三种方式
举一个例子:创建两个Servlet,分别叫AServlet与BServlet.
然后我访问AServlet,从AServlet跳转到BServlet
3.1 请求转发 Forward ★★★
/**
* req.getRequestDispatcher(String path)
* 拿到转发器/确认跳转的地址
* forward:进行跳转
*/
req.getRequestDispatcher("/forward/b").forward(req, resp);
注意:千万不要忘了写forward
请求转发的特点:
①:地址栏不变
②:只发送了一次请求
③:共享一个请求头(request)
怎么看到的:传了一个参数,在两个Servlet中都可以拿到
④:最后一个响应才起作用
请求的顺序:自己看一下图
⑤:不可以跨域访问(不要直接去跳转到其它网站)
⑥:可以访问WEB-INF里面的数据
3.2 重定向 Redirect ★★★
//直接跳转 -> 有点像我们直接在地址栏输入一个新的地址
resp.sendRedirect("/redirect/b");
重定向的特点:
①:地址栏会变化
②:每次跳转都会发送一个新的请求
③:请求头不共享
域对象
四大作用域
做数据共享的时候,我们把数据放在不同的地方
类 名称
PageContext page 当前页(作用不大)
HttpRequest request 一次请求
HttpSession session 一次会话(已经学过了)
ServletContext application 整个应用(有且只有一个对象)
解释:
pageContext:
每次访问的时候创建,可以有多个
Request:
每次请求的时候创建,可以有多个
Session:
每次会话的时候创建,不同人打开不同的浏览器,就创建多个,可以有个多个
Application:
整个应用有且只有一个对象,服务器启动就创建,关闭的时候销毁
该对象可以通过ServletConfig、Servlet、Request、Session获取到
域对象学习:
怎么把我们要共享的数据放到作用域里面?
作用域对象.setAttribute(String name,Object value);
怎么从作用域中拿到共享后的数据?
作用域对象.getAttribute(String name);
怎么从作用域中把数据删除?
作用域对象.removeAttribute(String name);
注意:每个作用域有自己的范围.
我们的数据放在哪一个作用域里面, 就必需到这一个作用域里面去拿数据!
普及:
什么时候,我们选择使用哪一个作用域?
Session只用于登录,保存当前登录的用户!!
Request我们平时从数据库拿到数据的展示都全用Request!!
Application一般会用到统计当前登录用户的数量上(现在都不用)
ServletContext对象
拿到ServletContext对象
//第一种方式(父类提供方法)
ServletContext sc1 = super.getServletContext();
//第二种方式(从ServletConfig中拿到)
ServletContext
sc2 = super.getServletConfig().getServletContext();
//第三种方式(从request中拿到)
ServletContext sc3 = req.getServletContext();
//第四种方式(从session中拿到)
ServletContext sc4 = req.getSession().getServletContext();
用哪个:能用哪个用哪个. 选简单的
ServletContext的方法
getContextPath : 拿到上下文路径
getRealPath : 拿到项目的真实路径
------------------------------------------
getInitParameter("encoding") : 拿到全局的初始参数
这个初始参数在哪:由我们在web.xml中进行配置