栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【JavaWeb】Java Servlet

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【JavaWeb】Java Servlet

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

Servlet语法格式

第一步:创建包

第二步:创建类(com.xxx.MyServlet),并且需要实现Servlet接口中的所有方法

public class MyServlet implements Servlet {

    
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("MyServlet init ...");
    }

    
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse)
            throws ServletException, IOException {
        System.out.println("MyServlet service ...");
    }

    
    @Override
    public String getServletInfo() {
        return null;
    }

    
    @Override
    public void destroy() {
        System.out.println("MyServlet destroy ...");
    }
}

方法介绍:

  • init:Servlet初始化时调用的方法
  • getServletConfig:获取当前Servlet的配置信息
  • service:调用Servlet真正去处理逻辑的方法
  • getServletInfo:它提供有关Servlet的信息,如作者、版本、版权
  • destroy:Servlet销毁时调用的方法

第三步:配置映射(web.xml中新增以下代码)

    
        MyServlet
        com.caochenlei.servlet.demo.MyServlet
    
    
        MyServlet
        /MyServlet
    

配置介绍: 在IDEA部署JavaWeb的二三事+Servlet配置

servlet标签用于配置Servlet的基本信息

  • servlet-class:代表当前Servlet的具体类路径,注意最后不包含.java
  • servlet-name:代表当前Servlet的别名,可以和原Servlet名称一样,也可以不一样,一般我们就一样就行了

servlet-mapping标签用于配置请求路径与具体处理Servlet的对应关系

  • url-pattern:这里写你要匹配的地址路径 com.caochenlei.servlet.demo.MyServlet
  • servlet-name:如果匹配到请求,该交给哪一个Servlet处理,这里的servlet-name其实就是一个Servlet的别名

第四步:启动tomcat,然后浏览器输入地址访问
(http://localhost:8080/MyServlet)

第五步:正常关闭Tomcat服务器

Servlet执行过程

Servlet生命周期

Servlet运行在Servlet容器中,其生命周期由容器来管理。

Servlet的生命周期通过javax.servlet.Servlet接口中的init()、service()和destroy()方法来表示。

Servlet的生命周期包含了下面4个阶段:

  • 类加载和实例化
  • 初始化:init()
  • 请求处理:service()
  • 销毁:destroy()
Servlet继承体系

有一种Servlet的实现子类,把大部分方法都是实现了,而我们只要关注请求处理就行了,那答案肯定是有的,这个类就是HttpServlet,我们只要继承HttpServlet类重写GET、POST方法就能实现一个简单的Servlet请求处理。
Servlet的继承体系如下图:

ServletContext

用来获取Servlet的上下文,在服务器启动的时候,会为托管的每一个web应用程序,创建一个ServletContext对象,当从服务器移除托管或者是关闭服务器时,ServletContext将会被销毁。它主要有以下几方面作用:

  • 获取全局配置参数
  • 获取web工程中的资源
  • 在servlet间共享数据域对象
ServletConfig

通过ServletConfig对象可以获取servlet在配置的时候一些信息

HttpServletRequest

HttpServletRequest这个对象封装了客户端提交过来的一切数据。

如何解决请求数据中文乱码问题?
  • GET方式
// 先用原来的编码解码再用UTF—8重新编码。
String newUsername = new String(username.getBytes("ISO-8859-1"), "UTF-8");
  • POST方式
// 这行设置一定要写在getParameter之前。
request.setCharacterEncoding("UTF-8");
HttpServletResponse

HttpServletResponse这个对象负责返回数据给客户端。

如何解决响应数据中文乱码问题?
  • 以字符流输出:response.getWriter()
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type", "text/html; charset=UTF-8");
response.getWriter().write("你好,世界!");
  • 以字节流输出:response.getOutputStream()
response.setHeader("Content-Type", "text/html;charset=UTF-8");
response.getOutputStream().write("你好,世界!".getBytes("UTF-8"));
重定向和请求转发
  • 重定向
// 第一种:使用示例
response.setStatus(302);
response.setHeader("Location", "login_success.html");*/
	
// 第二种:使用示例
response.sendRedirect("login_success.html");
  1. 地址上显示的是最后的那个资源的路径地址。
  2. 请求次数最少有两次,服务器在第一次请求后,会返回302以及一个地址,浏览器在根据这个地址,执行第二次访问。
  3. 可以跳转到任意路径,不是自己的工程也可以跳。
  4. 效率稍微低一点,执行两次请求。
  5. 后续的请求,没法使用上一次的request存储的数据,或者没法使用上一次的request对象,因为这是两次不同的请求。
  • 请求转发
// 使用示例:
request.getRequestDispatcher("login_success.html").forward(request, response);
  1. 地址上显示的是请求servlet的地址,返回200ok。
  2. 请求次数只有一次,因为是服务器内部帮客户端执行了后续的工作。
  3. 只能跳转自己项目的资源路径。
  4. 效率上稍微高一点,因为只执行一次请求。
  5. 可以使用上一次的request对象。
cookie

cookie其实是一份小数据,它是服务器给客户端并且存储在客户端上的一份小数据。

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取cookie ============================================================
        cookie[] cookies = request.getcookies();
        if (cookies.length == 1) {
            System.out.println("没有其它cookie存在,只有JSESSIONID这个cookie存在!");

            // 创建cookie ============================================================
            // 创建cookie对象
            cookie cookie = new cookie("username", "wanzi");
            // 添加cookie描述
            cookie.setComment("用户账号cookie");
            // 正值:表示在这个数字过后,cookie将会失效。
            // 负值:关闭浏览器,那么cookie就失效,默认值是 -1。
            // 注意:cookie是没有删除方法的,想让要cookie失效或清除,就只要让当前值为0就可以了。
            cookie.setMaxAge(60 * 60 * 24 * 7);
            // 重新为当前的这个cookie赋值
            cookie.setValue("lisi");
            // 只有访问域名 localhost 才会带上该cookie
            cookie.setDomain("localhost");
            // 只有访问请求 /myJavaWebDemo_war_exploded/cookieServlet 才会带上该cookie
            cookie.setPath("/myJavaWebDemo_war_exploded/cookieServlet");
            // 创建cookie ============================================================

            // 使用响应对象给浏览器响应的时候带上该cookie
            response.addcookie(cookie);
        } else {
            for (cookie cookie : cookies) {
                if ("username".equals(cookie.getName())) {
                    System.out.println(cookie.getName() + "====" + cookie.getValue());
                }
            }
        }
        // 获取cookie ============================================================
    }
Session

由于cookie会保存在客户端上,所以有安全隐患问题。还有一个问题,cookie的大小与个数有限制。
为了解决这些问题,于是就有了Session。
Session是基于cookie的一种会话机制
cookie是服务器返回一小份数据给客户端,并且存放在客户端上。
Session是数据存放在服务器端。

常见用法
// 获取Session对象
HttpSession session = request.getSession();

// 获取SessionID
String id = session.getId();

//存值
session.setAttribute(name, value);

//取值
session.getAttribute(name);

//删值
session.removeAttribute(name);

生命周期:
  • 创建:如果有在servlet里面调用了 request.getSession()
  • 销毁:关闭服务器或者session会话时间过期。默认有效期: 30分钟。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/300963.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号