IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Servlet总结 -> 正文阅读

[系统运维]Servlet总结

1.Servlet基础

servlet是运行在Web服务器端的Java应用程序,与Java此程序的区别就是,Serlvet对象主要封装了HTTP请求的处理,并且它的运行需要Servle容器的支持。

1.1 Servlet结构体系

在这里插入图片描述

Servlet是一个标准
Servlet和ServletConfig定义了Servlet的基本方法和相关配置信息

1.2 Sevlet技术特点

  • 功能强大
  • 可移植
  • 性能高效
  • 安全性高
  • 可扩展

1.3 Servlet与JSP的区别

  • 角色不同
  • 编程方法不同
  • Servlet需要编译后运行
  • 速度不同

1.4 第一个Servlet例子

创建Servlet

package com.lxg.servlet;

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;

public class Serlvet3 extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }
}

在web.xml中配置servlet

<servlet>
        <servlet-name>servlet3</servlet-name>
        <servlet-class>com.lxg.servlet.Servlet3</servlet-class>
        <!--
        指定Servlet的创建时机
        1.第一次被访问时创建,设置为负数
        2.在服务器启动时创建,设置为正数,一般1~10之间,数值大小代表创建的优先级
        -->
        <load-on-startup>5</load-on-startup>
    </servlet>

    <!--配置Servlet映射-->
    <servlet-mapping>
        <servlet-name>servlet3</servlet-name>
        <url-pattern>/servlet3</url-pattern>
    </servlet-mapping>

1.5 Servlet生命周期

  • 初始化阶段,可以是在服务器启动初始化,也可以在第一次调用初始化,生成实例。
  • 调用init();
  • 调用servicr();判断是哪一种请求,get请求会调用doGet(),post请求调用doPost();
  • 在服务器停止的时候,调用destroy();
package com.lxg.servlet;

import javax.servlet.*;
import java.io.IOException;

/**
 * @author lxg
 * @description Servlet的生命周期
 * @date 2021/10/18
 */
public class Servlet2 implements Servlet {

    /**
     * 初始化方法,在servlet被创建时执行,只会执行一次
     * Servlet什么时候被创建?
     *  * 默认情况下是,第一次被访问的时候创建,
     *  * 可以配置Servlet的创建时机,在web.xml中配置
     *servlet中的init方法只被执行一次,一个Servlet在内存中只有一个对象,Servlet是单例的
     *  * 多个用户同时访问时,可能存在线程安全问题
     *  * 解决:尽量不要在servlet中定义成员变量,即使定义的变量,也不要对其修改值
     *
     * @param servletConfig
     * @throws ServletException
     */
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init...");
    }

    /**
     * 获取ServletConfig对象
     * ServletConfig:Servlet的配置对象
     * @return
     */
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * 提供服务的方法,每一次Servlet被访问时就会执行,执行多次
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service...");
    }

    /**
     * 获取servlet的一些信息,版本、作者等
     * @return
     */
    public String getServletInfo() {
        return null;
    }

    /**
     * 销毁方法
     * 在Servlet被正常关闭时执行,只执行一次,
     * * Servlet被销毁时执行,服务器关闭时,Servlet被销毁
     * * 只有服务器正常关闭时,才会执行destroy方法
     * * destroy方法在Servlet被销毁之前执行,一般用于释放资源
     */
    public void destroy() {
        System.out.println("destroy...");
    }
}

几个知识点:

  • Servlet 启动时自动装载servlet,需要在 web.xml配置,在之间添加如下代码:< loadon-starup >1< /loadon-starup>,数字越小,优先级越高。如果不配置,则第一次访问servlet时装载。
  • servlet被加载的时候,会调用init()方法,在整个生命周期中init() 只会调用一次,装载后,实例贮存在服务器的内存中。

2.Servlet API编程常用接口和类

2.1 Servlet接口

package com.lxg.servlet;

import javax.servlet.*;
import java.io.IOException;

/**
 * Servlet:
 * Servlet是运行在服务端的Java应用程序,由Servlet容器来管理
 * 当用户对容器法人送HTTP请求的尸首,容器将通知相应地Servlet对象进行响应,完成用户与程序见的jiaohu.
 */
public class Servlet1 implements Servlet {
    /**
     * Servlet实例化后,Servlet容器调用该方法来完成初始化工作
     * @param servletConfig
     * @throws ServletException
     */
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    /**
     * 用于会获取servlet对象的配置信息,返回ServletConfig对象
     * @return
     */
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * 处理客户端的请求
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("servlet service running...");
    }

    /**
     * 返回有关Servlet的信息,如作者\版本等
     * @return
     */
    public String getServletInfo() {
        return null;
    }

    /**
     * 当Servlet对象从容器中移除时,容器调用该方法,释放资源
     */
    public void destroy() {

    }
}

2.2 ServletConfig接口

封装Servlet的配置信息,在Serlvet初始化期间被传递,每一个Servlet都有且是有一个ServletConfig对象。

		ServletConfig servletConfig = getServletConfig();
        servletConfig.getInitParameter("init");//获取初始化参数值
        servletConfig.getInitParameterNames();//获取所有初始化参数名称
        servletConfig.getServletContext();//获取Servlet上下文对象
        servletConfig.getServletName();//获取Servlet对象的实例名

2.3 HttpServletRequest接口

继承了javax.servlet.ServletRequest接口。

		req.getContextPath(); //获取请求的上下文路径,以"/"开头
        req.getCookies();//获取请求中发送的所有cookie对象,返回cookie的数组
        req.getMethod();//获取请求的方式
        req.getQueryString();//获取请求参数中的字符串形式
        req.getRequestURI();//获取URI
        req.getServletPath();//获取URI中的Servlet路径
        req.getSession();//获取与请求关联的HttpSession对象
package com.lxg.request;

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;
import java.util.Enumeration;

/**
 * @author lxg
 * @description request对象演示
 * @date 2021/10/18
 */
@WebServlet("/request1")
public class Request1 extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //演示request对象的方法

        //获取请求消息数据

        //1.获取请求行数据
        String method = req.getMethod();//获取请求行
        String contextPath = req.getContextPath();//获取虚拟路径
        String servletPath = req.getServletPath();//获取servlet路径
        String queryString = req.getQueryString();//获取get方式请求参数
        String requestURI = req.getRequestURI();//获取请求的URI
        StringBuffer requestURL = req.getRequestURL();//获取URL
        String protocol = req.getProtocol();//获取协议
        System.out.println(method);
        System.out.println(contextPath);
        System.out.println(servletPath);
        System.out.println(queryString);
        System.out.println(requestURI);
        System.out.println(requestURL);
        System.out.println(protocol);
        System.out.println("-------------------------------");
        
        //2.获取请求头数据
        Enumeration<String> headerNames = req.getHeaderNames();//获取所有请求头的名称
        while(headerNames.hasMoreElements()){
            String header = req.getHeader(headerNames.nextElement());
            System.out.println(header);
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }
}

2.4 HttpServletResponse接口

继承了javax.servlet.ServletResponse接口

		//向客户端写入Cookie
        resp.addCookie(new Cookie("hh","test"));
        //发送一个错误代码响应到客户端
        resp.sendError(404);
        //发送错误代码到客户端,以及错误信息
        resp.sendError(404,"msg");
        //重定向到location指向的资源
        resp.sendRedirect("/location");

2.5 GenericServlet类

GenericServlet实现了Servlet接口,将接口中的其他方法都做了默认实现,只是将service()方法作为抽象方法
如果通过集成GenericServlet来实现Serlvet类,只需要重写service方法即可,其他的方法,根据需要来选择是否重写

2.6 HttpServlet类

HttpServlet继承了GenericServlet类,通过其对GenericServlet类的扩展,可以很方便的对HTTP 请求进行处理及响应.

3.Servlet获取表单数据

login.jsp

<html>
<head>
    <title>login</title>
    <script>
        window.onload=function () {
            document.getElementById("img").onclick=function(){
                this.src="checkCodeServlet?time="+new Date().getTime();
            }
        }
    </script>
    <style>
        div{
            color:red;
        }
    </style>
</head>
<body>
    <form action="loginServlet" method="post">
        <table>
            <tr>
                <td>用户名</td>
                <td><input type="text" name="username"></td>
            </tr>
            <tr>
                <td>密码</td>
                <td><input type="text" name="password"></td>
            </tr>
            <tr>
                <td>验证码</td>
                <td><input type="text" name="checkCode"></td>
            </tr>
            <tr>
                <td colspan="2"><img id="img" src="checkCodeServlet"></td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="登录"></td>
            </tr>
        </table>
    </form>
    <div><%=request.getAttribute("cc_error")==null?"":request.getAttribute("cc_error")%></div>
    <div><%=request.getAttribute("login_error")==null?"":request.getAttribute("login_error")%></div>
</body>
</html>

loginServlet.ava获取登录页面的参数并处理

package com.lxg.session;

/**
 * @author lxg
 * @description 登录
 * @date 2021/10/23
 */
@WebServlet("/loginServlet")
public class LonginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置编码
        req.setCharacterEncoding("utf-8");
        //获取参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String checkCode = req.getParameter("checkCode");

        //获取生成的验证码
        HttpSession session = req.getSession();
        String  checkCode_session = (String)session.getAttribute("checkCode_session");
        //删除session
        session.removeAttribute("checkCode_session");
        //先判断验证码是否正确
        if(checkCode_session!=null && checkCode_session.equalsIgnoreCase(checkCode)){
            //忽略大小写比较字符串
            //验证码一致
            if("zhangsan".equals(username)&&"123".equals(password)){
                //登录成功
                //存储用户信息
                session.setAttribute("user",username);
                //重定向到success.jsp
                resp.sendRedirect(req.getContextPath()+"/success.jsp");

            }else{
                //登录失败
                req.setAttribute("login_error","用户名或密码错误");

                //转发到登录页面
                req.getRequestDispatcher("/login.jsp").forward(req,resp);
            }
            //判断用户名和密码是否一致
        }else{
            //验证码不一致
            //存储提示信息到request中
            req.setAttribute("cc_error","验证码不一致");
            //转发到登录页面
            req.getRequestDispatcher("/login.jsp").forward(req,resp);
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }
}

4.Servlet之间的跳转

1.转发(forward)

转发是通过requestDispatcher对象的forward(httpServletRequest req,HttpServletResponse res)方法来实现的。

request.getRequestDispatcher("/servlet/LifeCycleServlet").forward(request,response);

其中getRequestDispatcher方法的参数,必须以“/”开头,表示web的根目录,比如要 跳转: ”http://locahost:8080/servlet/servet/LifeCycleServlet”, 则参数为”/servlet/LifeCycleServlet”.

2.重定向(redirect)

通过httpServlet的sendDirect(String location)方法。

5.获取初始化参数

  1. 在 web.xml中配置servlet时,可以配置一些初始化参数,在servlet可以通过servletConfig接口提供的接口获取这些参数。

在web.xml中配置init-param 参数:

<servlet>
		
		<servlet-name>HelloServlet</servlet-name><!-- servlet的名字 -->
		<servlet-class>servlet.HelloServlet</servlet-class><!-- servlet的具体类型,需要带包名 -->
		<init-param>
			<param-name>username</param-name>
			<param-value>forezp</param-value>
		</init-param>
	</servlet>

在servlet中获取

public class HelloServlet extends HttpServlet {
	
	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		super.init();
		String name=this.getInitParameter("username");
		System.out.println(name);
	}
	
}

部署项目,访问helloServlet就可以看见在控制台打印了forezp

2.也可以配置一些全局的参数:context-param.

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<display-name></display-name>
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>


     <!--配置全局参数-->
	<context-param>
		<param-name>haha</param-name>
		<param-value>xixi</param-value>
	</context-param>
	
	</web-app>

获取方式:

servlet中通过getServletContext()获取servletContext对象,使用ServletContext的getInitParameter()方法获取制定参数名来获取参数。

ServletContext servletContext=getServletConfig().getServletContext();
		String str=servletContext.getInitParameter("haha");
		System.out.println(str);

6.servlet九大内置对象

在这里插入图片描述

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-25 12:48:54  更:2021-10-25 12:49:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 22:36:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码