超详细Servlet介绍+JavaBean+Jsp+request综合案例

文章目录

说一下get和post:
简单来说get请求就是地址栏输入信息,比如超链接过去,比如url+?=…调用doGet处理
post请求一般都是用表单提交,调用doPost处理

一、 Servlet【服务器端小程序】概述

1、 服务器端的应用程序
2、 属于JavaEE的标准规范
3、 Servlet必须继承和实现JavaEE提供的组件(javax.servlethttp.HttpServlet)支持
4、 必须在部署描述文件web.xml中进行配置
5、 在web的应用体系结构中属于控制器。对用户请求的数据进行处理并响应处理的结果。

二、Servlet构建步骤

【前提】:客户端(web浏览器)通过Http提出请求【get或者post】,web服务器接收到请求并将其转发给servlet,如果servlet’没有加载,则web服务器先把它加载到Java虚拟机并执行它。servlet接收并做响应的处理,然后将处理结果发送到web服务器,web服务器将处理结果返回到客户端。【对应request请求和response响应】
1、编写类并继承HttpServlet
2、重写doGet和doPost方法,用于处理用户的get请求或者post请求
3、在web.xml文件中配置部署Servlet
4、部署运行

三、Servlet的生命周期

1、创建Servlet对象

web服务器通过用户的请求路径创建Servlet对象。

2、Servlet对象调用初始化(init)的方法,初始化服务器参数信息(如果有)
在第一次请求Servlet时执行该方法,后续请求不再执行,Servlet对象常驻服务器内存。
3、调用服务的方法(doGet或者doPost)对用户请求的数据进行处理。
4、调用销毁的方法(destroy)清除Servlet对象
 销毁的方法一般在服务器关闭的时候执行
注意

Servlet在第一次访问时调用构造方法创建对象,然后在调用init方法进行初始化。后续请求只是调用服务的方法,处理用户的数据。

四、示例

1.编写UsersServlet.java
package com.servlet;

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

public class UsersServlet extends HttpServlet {
    public UsersServlet(){
        System.out.println("正在创建Servlet对象......");
    }
    @Override
    public void init() throws ServletException {
        System.out.println("正在初始化Servlet对象......");
    }

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("正在处理用户的get请求.......");
    }

    @Override
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("正在处理用户的post请求.......");
    }

    @Override
    public void destroy() {
        System.out.println("正在销毁Servlet对象.......");
    }
}


2.配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--配置Servlet类路径,该配置由web容器进行解析并创建Servlet类对象-->
    <servlet>
        <servlet-name>UsersServlet</servlet-name>
        <servlet-class>com.servlet.UsersServlet</servlet-class>
    </servlet>
    <!--该配置主要指定Servlet的访问路径-->
    <servlet-mapping>
        <servlet-name>UsersServlet</servlet-name>
        <url-pattern>/servlet/UsersServlet</url-pattern>
    </servlet-mapping>
</web-app>
3.在index.jsp里面访问servlet
<%--
  Created by IntelliJ IDEA.
  User: 顾念思成
  Date: 2021/4/23
  Time: 9:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>测试</title>
  </head>
  <body>
  <a href="servlet/UsersServlet">get方式请求</a>

  <form action="servlet/UsersServlet" method="post">
    <input type="submit" name="smt" value="post请求">
  </form>

  </body>
</html>

演示:

index页面
在控制台查看:

[2021-04-23 12:35:38,033] Artifact prjJavaWebDemo10: Artifact is deployed successfully
[2021-04-23 12:35:38,033] Artifact prjJavaWebDemo10: Deploy took 820 milliseconds
23-Apr-2021 12:35:47.010 淇℃伅 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory 鎶妛eb 搴旂敤绋嬪簭閮ㄧ讲鍒扮洰褰� [D:\Tool\apache-tomcat-9.0.24-windows-x64\apache-tomcat-9.0.24\webapps\manager]
23-Apr-2021 12:35:47.153 淇℃伅 [Catalina-utility-1] org.apache.jasper.servlet.TldScanner.scanJars 鑷冲皯鏈変竴涓狫AR琚壂鎻忕敤浜嶵LD浣嗗皻鏈寘鍚玊LD銆� 涓烘璁板綍鍣ㄥ惎鐢ㄨ皟璇曟棩蹇楄褰曪紝浠ヨ幏鍙栧凡鎵弿浣嗘湭鍦ㄥ叾涓壘鍒癟LD鐨勫畬鏁碕AR鍒楄〃銆� 鍦ㄦ壂鎻忔湡闂磋烦杩囦笉闇�瑕佺殑JAR鍙互缂╃煭鍚姩鏃堕棿鍜孞SP缂栬瘧鏃堕棿銆�
23-Apr-2021 12:35:47.159 淇℃伅 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [D:\Tool\apache-tomcat-9.0.24-windows-x64\apache-tomcat-9.0.24\webapps\manager] has finished in [149] ms
正在创建Servlet对象......
正在初始化Servlet对象......
正在处理用户的post请求......
正在处理用户的get请求......
正在处理用户的post请求......
D:\Tool\apache-tomcat-9.0.24-windows-x64\apache-tomcat-9.0.24\bin\catalina.bat stop
Using CATALINA_BASE:   "C:\Users\顾念思成\AppData\Local\JetBrains\IntelliJIdea2021.1\tomcat\635bcd47-5d5e-469a-9ebd-5b8a041c7730"
Using CATALINA_HOME:   "D:\Tool\apache-tomcat-9.0.24-windows-x64\apache-tomcat-9.0.24"
Using CATALINA_TMPDIR: "D:\Tool\apache-tomcat-9.0.24-windows-x64\apache-tomcat-9.0.24\temp"
Using JRE_HOME:        "D:\Java\jdk"
Using CLASSPATH:       "D:\Tool\apache-tomcat-9.0.24-windows-x64\apache-tomcat-9.0.24\bin\bootstrap.jar;D:\Tool\apache-tomcat-9.0.24-windows-x64\apache-tomcat-9.0.24\bin\tomcat-juli.jar"
23-Apr-2021 12:44:10.068 淇℃伅 [main] org.apache.catalina.core.StandardServer.await A valid shutdown command was received via the shutdown port. Stopping the Server instance.
23-Apr-2021 12:44:10.068 淇℃伅 [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8080"]
NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
23-Apr-2021 12:44:10.235 淇℃伅 [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["ajp-nio-8009"]
23-Apr-2021 12:44:10.397 淇℃伅 [main] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina]
正在摧毁Servlet对象......
23-Apr-2021 12:44:10.416 淇℃伅 [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]
23-Apr-2021 12:44:10.418 淇℃伅 [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"]
23-Apr-2021 12:44:10.419 淇℃伅 [main] org.apache.coyote.AbstractProtocol.destroy 姝e湪鎽ф瘉鍗忚澶勭悊鍣� ["http-nio-8080"]
23-Apr-2021 12:44:10.420 淇℃伅 [main] org.apache.coyote.AbstractProtocol.destroy 姝e湪鎽ф瘉鍗忚澶勭悊鍣� ["ajp-nio-8009"]
NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
Disconnected from server

五、实例:jsp+JavaBean+servlet+request实现简单的登录验证

1.编写login.jsp页面
<%--
  Created by IntelliJ IDEA.
  User: 顾念思成
  Date: 2021/4/23
  Time: 10:53
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录页面</title>
</head>
<body>
    <form action="dologin.jsp" method="post">
        账号:<input type="text" name="uname" >
        密码:<input type="password" name="upasswd">
        <input type="submit" value="登录" >
        <input type="reset" value="取消">
    </form>

</body>
</html>

2.编写收集用户信息的dologin.jsp页面,并将数据设置到request范围,转发给UsersServlet

(1)设置字符编码

<%
  request.setCharacterEncoding("utf-8");
  response.setCharacterEncoding("utf-8");
%>

(2)将User添加到request的scope并跳转到servlet页面处理数据

<jsp:useBean id="us" class="com.bean.User" scope="request"/>

<!--调用指令,与import类似,可以实例化一个对象 id是实例化对象名称 -->
<jsp:setProperty name="us" property="*"/>
<!--设置属性,name是实例化对象名称id,property指定属性,param指定参数,value指定内容取得属性是getProperty标签-->
<jsp:forward page="servlet/UsersServlet"/>
<!--上述动作标签为转发的动作标签,替代以下代码RequestDispatcher dispater=request.RequestDispatcher("/servlet/UsersServlet");dispater.forward(request,response);-->

(3)整体代码:

<%--
  Created by IntelliJ IDEA.
  User: 顾念思成
  Date: 2021/4/23
  Time: 10:53
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>数据处理</title>
</head>
<%
  request.setCharacterEncoding("utf-8");
  response.setCharacterEncoding("utf-8");
%>
<jsp:useBean id="us" class="com.bean.User" scope="request"/>

<!--调用指令,与import类似,可以实例化一个对象 id是实例化对象名称 -->
<jsp:setProperty name="us" property="*"/>
<!--设置属性,name是实例化对象名称id,property指定属性,param指定参数,value指定内容取得属性是getProperty标签-->
<jsp:forward page="servlet/UsersServlet"/>
<!--上述动作标签为转发的动作标签,替代以下代码RequestDispatcher dispater=request.RequestDispatcher("/servlet/UsersServlet");dispater.forward(request,response);-->
<body>

</body>
</html>

3.编写UsersServlet

(1) 设置字符编码

//设置字符编码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

(2)设置响应内容类型

//设置响应的内容类型  text前是处理后是下载
        resp.setContentType("text/html");

(3)定义字符输出流对象

//获取输出字符流对象 准备输出信息
        PrintWriter out = resp.getWriter();

(4)从request属性中获取User对象,并做逻辑上的判断,不为空然后跳转到loginok.jsp页面,把req和resp都转过去

        //从request的属性中获取User对象
        User us = (User) req.getAttribute("us");
        if (us!=null){
            if (us.getUname()!=null&&us.getUpasswd()!=null){
                //转发User对象到loginok.jsp
                RequestDispatcher dispatcher = req.getRequestDispatcher("/loginok.jsp");
                dispatcher.forward(req,resp);

            }else{
                out.println("账号或者密码错误,请重新<a href='login.jsp'>登录</a>!");
            }
        }else{
            out.println("请从login.jsp页面<a href='login.jsp'>登录</a>!");
        }

        System.out.println("正在处理用户的post请求......");
    }

(5)整体代码:

package com.servlet;

import com.bean.User;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class UsersServlet extends HttpServlet {

    public UsersServlet() {
        System.out.println("正在创建Servlet对象......");
    }

    @Override
    public void init() throws ServletException{
        System.out.println("正在初始化Servlet对象......");
    }

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("正在处理用户的get请求......");
    }

    @Override
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //设置字符编码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        //设置响应的内容类型  text前是处理后是下载
        resp.setContentType("text/html");
        //获取输出字符流对象 准备输出信息
        PrintWriter out = resp.getWriter();

        //从request的属性中获取User对象
        User us = (User) req.getAttribute("us");
        if (us!=null){
            if (us.getUname()!=null&&us.getUpasswd()!=null){
                //转发User对象到loginok.jsp
                RequestDispatcher dispatcher = req.getRequestDispatcher("/loginok.jsp");
                dispatcher.forward(req,resp);

            }else{
                out.println("账号或者密码错误,请重新<a href='login.jsp'>登录</a>!");
            }
        }else{
            out.println("请从login.jsp页面<a href='login.jsp'>登录</a>!");
        }

        System.out.println("正在处理用户的post请求......");
    }
    @Override
    public void destroy(){
        System.out.println("正在摧毁Servlet对象......");
    }
}

4.编写loginok.jsp页面
<%--
  Created by IntelliJ IDEA.
  User: 顾念思成
  Date: 2021/4/23
  Time: 10:53
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>登录成功</title>
</head>
<c:if test="us==null">
    <c:redirect url="login.jsp"></c:redirect>
</c:if>
<body>
    <h3>登录成功</h3>
    <hr>
    <h5>欢迎${us.uname}登录,您的密码是${us.upasswd}!</h5>
</body>
</html>

数据传输过程:

login.jsp【表单post提交】—>dologin.jsp【接收数据表单数据封装成User类对象并设置到request作用域然后跳转到servlet】---->UsersServlet.java【从request中取出数据做判断成功跳转到loginok.jsp把请求和响应也要跳转过去,否则到login.jsp页面】----->loginok.jsp或者login.jsp

演示:

login.jsp
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

### 回答1: 这是一个关于 JDK 的 Java 选项的提示信息,其中包含了三个参数:--add-opens=java.base/java.lang=all-unnamed、--add-opens=java.base/java.io=all-unnamed 和 --add-opens=java.rmi/sun.rmi.transport=all-unnamed。这些参数的作用是打开一些 Java 模块的访问权限,以便程序能够正常运行。 ### 回答2: 这段话是指在安装Java Development Kit(JDK)时,设置了一些参数,其中包括了三个--add-opens选项。这些选项被用来控制Java模块化系统中的包之间的可访问性,其中--add-opens选项允许将一个包的开放转移到另一个包中,以便在代码中可以访问这些包。 具体来说,这三个选项的作用如下: --add-opens=java.base/java.lang=all-unnamed:允许java.lang包下的所有类可以被所有未命名模块(即没有export声明的模块)访问。 --add-opens=java.base/java.io=all-unnamed:允许java.io包下的所有类可以被所有未命名模块访问。 --add-opens=java.rmi/sun.rmi.transport=all-unnamed:允许sun.rmi.transport包中的所有类在所有未命名模块中被访问,以支持Java远程方法调用。 这些选项都是为了解决Java模块化系统中访问控制的问题而设置的。Java模块化系统将Java SE 9中引入的的重要特性之一,用于管理和组织Java平台的各个组件,更好地支持解耦和重用代码。在这种情况下,控制代码的可见性是必然的。 总结一下,这个命令行参数的目的是允许指定的模块之间进行互操作,从而扩展了Java以支持更加灵活的应用程序。这种输入非常具体化,对Java开发人员来说非常重要,因为他们需要确保代码可以编译和运行,而在Java模块化环境中,不能访问私有的API。 ### 回答3: 这个信息是指在Java开发环境中,通过另一个程序或者脚本获取到的一组JDK参数设置,具体是关于--add-opens选项的设置。这个选项用于打开一些Java模块中的未命名包,以方便开发者在使用Java模块时更加灵活、自由地访问其中各种资源。 具体来说,这个选项设置了三个参数:--add-opens=java.base/java.lang=all-unnamed、--add-opens=java.base/java.io=all-unnamed、--add-opens=java.rmi/sun.rmi.transport=all-unnamed。第一组参数表示将Java基础模块中的java.lang包中所有未命名的资源包全部打开;第二组参数表示将Java基础模块中的java.io包中所有未命名的资源包全部打开;第三组参数则是将Java RMI(远程方法调用)模块中的sun.rmi.transport包中的所有未命名资源包打开。 这个设置的意义主要在于在使用Java开发项目时,尤其是在使用一些第三方库或者框架时,可能会需要访问到一些Java模块中的未命名资源包,例如一些未公开的API、内部实现类等等,而Java默认情况下是不允许访问这些资源包的。通过使用--add-opens选项,开发者可以将这些资源包打开,使得自己可以更加灵活地使用和定制Java环境,提高开发效率和代码可读性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值