JavaEE应用-Servlet

JavaEE 基础

一:Servlet 实现

继承抽象类 HttpServlet 的重写部分方法(常用)

添加注解 @WebServlet(“/LoginServlet”)

servlet3.0 引入了 @WebServlet,@WebFilter 等注解,可以代替在 web.xml 中通过 等标签进行配置 , 从而可以摆脱掉 web.xml,@WebServlet(“/LoginServlet”)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
创建 Indexservlet 的类
package com.example.demo2;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
* servlet实现
* 1,创建Class类
* 2,继承HttpServlet类
* 3,重写Service()方法(Service方法在Servelt类被访问时自动调用,作用:接受请求,响应结果)
* 4,在Servlet中添加注解,设置资源对位访问路径,浏览器通过访问路径,访问到Servlet类
*/

@WebServlet("/ser01") //添加注解,访问路径
public class Indexservlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Hello,Indexservlet"); //输出在控制台
//响应数据
resp.getWriter().write("Hello,Index"); //输出到客户端
}
}

二:Servlet 的工作流程与生命周期

Servlet 的生命周期可以分为四个阶段,即装载类及创建实例阶段、初始化阶段、服务阶段和实例销毁阶段。

  • 1、初始化阶段 调用 init () 方法
  • 2、响应客户请求阶段。调用 service () 方法,由 service () 方法根据提交的方式选择执行 doGet () 或者 doPost () 方法
  • 3、终止阶段  调用 destroy () 方法

工作流程:

  • 通过请求头获知浏览器访问的是哪个主机
  • 在通过请求行获取访问的是哪个 web 应用
  • 再通过请求行中的请求路径获知访问的是哪个资源
  • 通过获取的资源路径在配置中匹配到真实路径
  • 服务器会创建 servlet 对象,(如果第一次访问时,创建 - servlet 实例,并调用 init 方法进行初始化操作)
  • 调用 service(request,response)方法来处理请求和响应的操作
  • 调用 service 完毕后返回服务器 由服务器将 response 缓冲区的数据取出

三,HttpServleRequest 对象

作用:主要用来接受客户端发送过来的请求信息。例如:请求的参数,发送的头信息等都属于客户端发来的信息,service () 方法中的形参接受的是 HttpServletRequest 接口的实例化对象,表示对象主要运用在 HTTP 协议上,该对象有 Tomcat 封装好传递过来

接受请求:

常用方法:

getRequestURL ():获取客户端发出请求时的完整 URL

getRequestURL ():获取请求行中的资源名称部分(项目名称开始)

getQueryString ():获取请求行中的参数部分

getMethod ():获取客户端的请求方式

getProtocol ():获取 HTTP 版本号

getContextPath ():获取 webapp 名字(站点名)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
String url = req.getRequestURL().toString();
System.out.println("获取客户端请求的完整URL "+url);
//获取客户端请求的完整URL (从http 开始,到?前面结束)
String uri = req.getRequestURI();
System.out.println("获取客户端请求的完整URi "+uri);
//获取请求中的参数部分
String queryString=req.getQueryString();
System.out.println("获取请求中的参数部分:"+queryString);
//获取客户端的请求方式
String method = req.getMethod();
System.out.println("获取客户端的请求方式:"+method);
//获取HTTP版本号
String protocol=req.getProtocol();
System.out.println("获取HTTP版本号:"+protocol);
//获取webapp名字(站点名)
String webapp =req.getContextPath();
System.out.println("获取webapp名字(站点名):"+webapp);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
*获取请求参数
* 1.通过参数名获取参数值, 返回字符串
* req.getParameter("参数名");
* 参数名:
* 1.表达元素name属性值
* 2.ajax的data属性值的键
* 3.超链接参数的键
* 2.通过参数名获取所有的参数值,返回数组
*
** */
//获取用户名
String uname = req.getParameter("unmae");
String upwd = req.getParameter("upwd");
System.out.println("姓名:"+uname+"密码"+upwd);

//通过参数名获取所有的参数值,返回数组
String[] hobby =req.getParameterValues("hobby");
System.out.println(hobby.length);

请求转发:

请求转发,是一种服务器的行为,当客户端请求达到后,服务器进行准发,此时会将请求对象进行保存,地址栏中的 URL 地址不会改变,得到响应后,服务端在响应发送给客户端,从始至终只有一个请求发出。

1
request.getRequestDispatcher(url).forward(request.response);

Request 作用域

通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务跳转有效

1
2
3
4
5
6
//设置域对象内容
request.setAttribute(String name,String value);
//获取域对象内容
request.getAttrbute(String name);
//删除域对象内容
request.removeAttrbute(String name);

request 域对象中的数据在一次请求中有效,则经过请求转发,request 域中的数据依然存在,则在请求转发的过程中可以通过 request 来传输 / 共享数据

响应数据
接收到客户端请求后,可以通过 HttpServletResponse 对象直接进行响应,响应时需要获取输出流。
有两种形式:
getWriter() 获取字符流 (只能响应回字符)
getOutputStream() 获取字节流 (能响应一切数据)

重定向

重定向是一种服务器指导,客户端的行为。客户端发出第一个请求,被服务器接收处理后,服务器会进行响应,在响应的同时,服务器会给客户端一个新的地址,当客户端接收到响应后,会立刻、马上、自动根据服务器给的新地址发起二个请求,服务器接收请求并作出响应,重定向完成。

resp.sendRedirect("url");

请求转发与重定向的区别

    1. 请求转发的地址栏不发生改变,重定向的地址会被改变
    1. 请求转发是服务端跳转,重定向是客户端跳转
    1. 请求转发是一次请求,重定向是两次请求
    1. 请求转发是 request 作用域可以共享,重定向是不可以共享
    1. 请求转发的地址是跳转到当前项目的资源,重定向可
      跳转到任意资源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.example.demo2;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/ser03")
public class servlet03 extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("yes.....");

String name = req.getParameter("name");
String pwd = req.getParameter("pwd");

System.out.println("servlet...");

//请求转发(服务端)
// req.getRequestDispatcher("index.jsp").forward(req,resp);

//重定向 跳转到首页(服务端)
resp.sendRedirect("http://www.baidu.com");
//跳转到百度
}
}

Cookie 对象
通过 new Cookie (“key” “value”); 来创建一个 Cookie 对象,要想将 Cookie 随响应发送到客户端,需要先添加到 response 对象中,response.addCookie (cookie); 此时该 cookie 对象则随着响应发送至了客户端。在浏览器上可以看见

cookie 获取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Cookie cookie =new Cookie("uname","admin");

//响应cookie对象
resp.addCookie(cookie);



package com.shsxt.servlet.Cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
* Cookie
* 是浏览器技术
* Cookie对象的创建与发送
* */

@WebServlet("/cook01")
public class Cookie01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//得到Cookie对象

Cookie cookie =new Cookie("uname","admin");

//响应cookie对象
resp.addCookie(cookie);
}
}

Cookie 的路径

Cookie 的 setPath 设置 cookie 的路径,这个路径直接决定服务器的请求是否会从浏览器中加载某些 cookie。

        // 1.当前服务器下,任务项目的任意资源,都可获取Cookie对象
        Cookie cookie01=new Cookie("aa","AA");
        cookie01.setPath("/");
        resp.addCookie(cookie01);

//      2.在当前项目下,可以获取cookie对象(默认)
        Cookie cookie02=new Cookie("bb","BB");
        cookie02.setPath("/zhongsheng");
        resp.addCookie(cookie02);
//        3.在指定项目下,可获取cookie对象(指定项目站点名:/s05)
        Cookie cookie03=new Cookie("cc","CC");
        cookie03.setPath("/ser05");
        resp.addCookie(cookie03);
//        4.在指定项目的指定资源下,以获取cookie对象
        Cookie cookie04=new Cookie("dd","DD");
        cookie04.setPath("/zhongsheng/test");
        resp.addCookie(cookie04);

Cookie 的 setPath 设置 cookie 的路径,这个路径直接决定服务器的请求是否会从浏览器中加载某些 cookie。
*
当前项目:站点名为:/zhongsheng
当前服务域名为:localhost:8080
设置路径:setpath (), 默认当前项目的站点名
setPath(“/zhongsheng”)
*

    1. 当前服务器下,任务项目的任意资源,都可获取 Cookie 对象
  • serpath(“/”);
    1. 在当前项目下,可以获取 cookie 对象(默认)
  • setPath(“/zhongsheng”)
    1. 在指定项目下,可获取 cookie 对象(指定项目站点名:/s05)
  • setPath(“/s05”)
    1. 在指定项目的指定资源下,以获取 cookie 对象
      setPath(“/zhongsheng/ser12”);

HttpSesion 对象

对于服务器而言,每一个连接到它的客户端都是一个 session,servlet 容器使用此接口创建 HTTP 客户端和 HTTP 服务器之间的会话。会话将保留指定的时间段,跨多个连接或来自用户的页面请求。一个会话通常对应于一个用户,该用户可能多次访问一个站点。可以通过此接口查看和操作有关某个会话的信息,比如会话标识符、创建时间和最后一次访问时间。在整个 session 中,最重要的就是属性的操作。

session 无论客户端还是服务器端都可以感知到,若重新打开一个新的浏览器,则无法取得之前设置的 session,因为每一个 session 只保存在当前的浏览器当中,并在相关的页面取得。

Session 的作用就是为了标识一次会话,或者说确认一个用户;并且在一次会话(一个用户的多次请求)期间共享数据。我们可以通过 request.getSession () 方法,来获取当前会话的 session 对象。

//创建获取Session
HttpSession session =req.getSession();
//设置sessiony

标识符 JSESSIONID

Session 既然是为了标识一次会话,那么此次会话就应该有一个唯一的标志,这个标志就是 sessionld。

每当一次请求到达服务器,如果开启了会话 (访问了 session),服务器第一步会查看是否从客户端回传一个名为 JSESSIONID 的 cookie,如果没有则认为这是一次新的会话,会创建一个新的 session 对象,并用唯一的 sessionld 为此次会话做一个标志。如果有 JESSIONID 这个 cookie 回传,服务器则会根据 JSESSIONID 这个值去查看是否含有 id 为 JSESSION 值的 session 对象,如果没有则认为是一个新的会话,重新创建一个新的 session 对象,并标志此次会话;如果找到了相应的 session 对象,则认为是之前标志过的一次会话共享。

这里提到一个叫做 JSESSIONID 的 cookie,这是一个比较特殊的 cookie,当用户请求服务器时,如果访问了 session,则服务器会创建一个名为 JSESSIONID,值为获取到的 session (无论是获取到的还是新创建的) 的 sessionld 的 cookie 对象,并添加到 response 对象中,响应给客户端,有效时间为关闭浏览器。

所以 Session 的底层依赖 Cookie 来实现。

package com.shsxt.servlet.Session;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
* Session的作用域
*
*    再一次会话中有效
*    通过setAttribute(name , value)方法向域对象中添加数据
*    通过getAttribute(name)从域对象中获取数据
*    通过removeArribute(name)从域对象移除数据
*
*    request作用域
*       知在一次请求有效
*       只在请求转发跳转有效
*    session作用域:
*        在一次会话中有效,会话中包含多次请求
*        在请求转发与重定向跳转后都有效
*        
**/

@WebServlet("/ses02")
public class Session02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //创建获取Session
        HttpSession session =req.getSession();
        System.out.println("session02"+session.getId());

        //request作用域
        req.setAttribute("requestMsg","request的作用域");

        //session作用域
        session.setAttribute("sessionMsg","session的作用域");

        //请求转发
//        req.getRequestDispatcher("index.jsp").forward(req,resp);
        //重定向
        resp.sendRedirect("index.jsp");


    }
}