文章目录
说一下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>
演示:
在控制台查看:
[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
演示: