Servlet—环境,生命周期,session,重定向,转发
Servlet简介(什么是Servlet)
Eclipse JSP/Servlet 环境搭建:
然后点击进去往下滑,选择自己电脑对应的是32位还是64位

解压文件夹如下:

- bin:二进制执行文件。里面最常用的文件是startup.bat,如果是 Linux 或 Mac 系统启动文件为 startup.sh。
- conf:配置目录。里面最核心的文件是server.xml。可以在里面改端口号等。默认端口号是8080,也就是说,此端口号不能被其他应用程序占用。
- lib:库文件。tomcat运行时需要的jar包所在的目录
- logs:日志
- temp:临时产生的文件,即缓存
- webapps:web的应用程序。web应用放置到此目录下浏览器可以直接访问
- work:编译以后的class文件。
接着我们在浏览器中输入 http://localhost:8080/,如果弹出如下界面,表示tomcat安装成功并且启动起来了:

实现Servlet
写相关servlet类
package com.demo;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class D extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//respon的getWriter方法服务端回应客户端信息
response.getWriter().write("66");
}
}
<servlet>
<servlet-name>D</servlet-name>
<servlet-class>com.hzj.D</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>D</servlet-name>
<url-pattern>/D</url-pattern>
</servlet-mapping>
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String name=request.getParameter("name");
String age=request.getParameter("age");
response.getWriter().write("nihao");
System.out.println(name+" "+age);
}
}

Servlet的url配置方式, (注意@WebServlet("/***")这个注释也可以,不过web.xml的优先级高,先去访问web.xml)
<servlet>
<servlet-name>LX03</servlet-name>
<servlet-class>com.demo.LX03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LX03</servlet-name>
<url-pattern>/LX03</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>LX04</servlet-name>
<servlet-class>com.demo.LX04</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LX04</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>D</servlet-name>
<servlet-class>com.demo.D</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>D</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Servlet从创建到销毁所经历的方法,Servlet的生命周期(初始化,提供服务,销毁)
void init(ServletConfig)
void service(ServletRequest,ServletResponse)
void destory()
public LX03() {
super();
System.out.println("---LX03---");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(this);
}
Servlet 调用inti方法的时间
-- 可以是用户第一次访问该 Servlet 时——web.xml 文件的<load-on-startup>标签
不配置或者配置为小于零的数;
-- 也可以指定 Servlet 在服务器第一次启动时调用 init 方法——web.xml 文件
的<load-on-startup>标签配置为大于等于0的数。
当用户调用一个 Servlet时,会创建一个 Servlet 实例,
每个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或者 doPost 方法。
web.xml编码,设为utf-8
<servlet>
<servlet-name>LX03</servlet-name>
<servlet-class>com.demo.LX03</servlet-class>
<init-param>
<param-name>encode</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>LX03</servlet-name>
<url-pattern>/LX03</url-pattern>
</servlet-mapping>
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletConfig config = this.getServletConfig();
String encode = config.getInitParameter("encode");
System.out.println(encode);
}
load-on-startup,(默认配置的@WebServlet注解是-1,所以默认就是-1)如下图LX03的为3,LX04的为0
在servlet的配置当中,<load-on-startup>1</load-on-startup>的含义是:标记容器是否在启动的时候就加载这个servlet。
当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。
正数的值越小,启动该servlet的优先级越高。
如果我们在web.xml中设置了多个servlet的时候,可以使用load-on-startup来指定servlet的加载顺序,服务器会根据load-on-startup的大小依次对servlet进行初始化。不过即使我们将load-on-startup设置重复也不会出现异常,服务器会自己决定初始化顺序。
配置load-on-startup后,servlet在startup后立即加载,但只是调用servlet的init()方法,用以初始化该servlet相关的资源。初始化成功后,该servlet可响应web请求;如未配置load-on-startup,容器一般在第一次响应web请求时,会先检测该servlet是否初始化,如未初始化,则调用servlet的init()先初始化,初始化成功后,再响应请求。
PS:一般我们在开发web应用时,都会配置这个参数,有两个好处:1、如果初始化过程失败,则容器会提示启动失败,此时我们能够提前知道相关错误;2、配置该参数相当于将初始化servlet的工作转移到容器启动过程,使得容器只要启动成功后,就可立即响应web请求。
<servlet>
<servlet-name>LX03</servlet-name>
<servlet-class>com.demo.LX03</servlet-class>
<init-param>
<param-name>encode</param-name>
<param-value>UTF-8</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>LX03</servlet-name>
<url-pattern>/LX03</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LX04</servlet-name>
<servlet-class>com.demo.LX04</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>LX04</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>


request和response

Cookie
cookie可以保存会话状态,但是在这个会话状态是保留在1客户端的。只cookie清除或者cookie失效这个会话状态就没有了。
cookie是保存在浏览器客户端的cookie可以保存在浏览器的缓存中,浏览器关闭cookie消失。cookie也可以保存在客户端的硬盘文件中,浏览器关闭cookie还在除非cookie失效
cookie实现的功能有:保留购物车商品的状态在客户端上,十天内免登录
添加两个cookie
Cookie cookie = new Cookie("D","H"); Cookie cookie2 = new Cookie("H","D"); response.addCookie(cookie); response.addCookie(cookie2);
打开浏览器可以看到存储的两个cookie

Session会话。
session是自己的,别人拿不到我放的session
什么是session,session就是一次会话,tomcat启动会发送请求,多次请求,只要没结束这个会话,就是一次session
从客户端到服务器发送请求,服务器响应客户端就是一次请求,session就是多次请求,多次响应,从开始到关闭。
我的浏览器和tomcat通信放的session我自己可以取出来,别人取不出来,因为我的浏览器和tomcat通信属于一次session
cookie可以将会话保存到客户端,session可以将会话保存到服务器端
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置session名字为djm
HttpSession session = request.getSession();
session.setAttribute("name","djm");
}
//另一个servlet
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//然后获取上个servlet设置的session
HttpSession session = request.getSession();
Object object = session.getAttribute("name");
System.out.println(object);
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
HttpSession session = request.getSession();
session.setAttribute("name",name);
}
//另一个servlet
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//然后获取上个servlet设置的session
HttpSession session = request.getSession();
Object object = session.getAttribute("name");
System.out.println(object);
}

servletcontext,每个人都可以拿到获取信息(和session差不多的方式)request.getServletContext();获取,servletcontext是同一个,是共享的
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name=request.getParameter("name");
ServletContext application = request.getServletContext();
application.setAttribute("name",name);
}
//另一个servlet
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//然后获取上个servlet设置的application
ServletContext application = request.getServletContext();
Object object = application.getAttribute("name");
System.out.println(object);
}


request,注意request在另一个servlet取不到,这个是可以自己传,自己收到(session在另一个servlet可以取到,servletcontext可以在另一个浏览器取到)
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name=request.getParameter("name");
request.setAttribute("name",name);
Object object = request.getAttribute("name");
System.out.println(object);
}

重定向
public class Redirect extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String name=request.getParameter("name");
response.sendRedirect("/Servlet/RedirectTest");
}
}
public class RedirectTest extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String name=request.getParameter("name");
System.out.println(name);
}
}




public class Redirect extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String name=request.getParameter("name");
response.sendRedirect("/Servlet/RedirectTest?name"+name);
}
}
转发
public class Redirect extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//转发 request
String name=request.getParameter("name");
request.getRequestDispatcher("/RedirectTest").forward(request, response);
}
}
public class RedirectTest extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String name=request.getParameter("name");
System.out.println(name);
}
}


转发和重定向区别
1、请求次数
重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址;重定向至少请求两次,转发请求一次;
2、地址栏不同
重定向地址栏会发生变化,转发地址栏不会发生变化;
3、是否共享数据
重定向两次请求不共享数据,转发一次请求共享数据(在request级别使用信息共享,使用重定向必然出错);
4、跳转限制
重定向可以跳转到任意URL,转发只能跳转本站点资源;
5、发生行为不同
重定向是客户端行为,转发是服务器端行为;
注意:把数据放到request中,只有转发才能拿出来,因为重定向是发送了两次请求,而转发则是一次请求,两次请求的话会发生变化,所request在重定向的时候拿不到Servlet九大内置对象


浙公网安备 33010602011771号