Java Web 学习笔记 06 Servlet 案例(get、post,转发与重定向)

2023-11-16

案例一(初体验 Servlet web项目)

(1)LoginServlet:

package com.alex.web.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;

//Servlet 对象时单例的,伪单例
//public class LoginServlet implements Servlet{
public class LoginServlet extends HttpServlet{

	//声明周期方法
 	//生命周期:表示对象从创建、初始化、使用、销毁过程

	//创建对象
 	public LoginServlet(){
  		System.out.println("LoginServlet.....");
 	}

	//销毁对象时使用
 	@Override
 	public void destroy() {
  		System.out.println("destroy ......");
 	}

	//初始化对象
 	//初始化方法只执行一次
 	@Override
 	public void init(ServletConfig servletconfig) throws ServletException {
  		System.out.println("init ... ...");
 	}

	//处理请求使用的
 	@Override
 	public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
  		System.out.println("service ... ...");
  		response.getWriter().println("Hello World... ...");
 	}
 }

(2)web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
 	id="WebApp_ID" version="3.1">
 	<display-name>web_servlet01</display-name>
	<servlet>
  		<servlet-name>LoginServlet</servlet-name>
  		<servlet-class>com.alex.web.servlet.LoginServlet</servlet-class>
    			<!-- load-on-startup 值大于等于0的整数值,表示服务器启动时创建Servlet,值越小优先级越高 -->
  		<load-on-startup>1</load-on-startup>
 	</servlet>
 	<servlet-mapping>
  		<servlet-name>LoginServlet</servlet-name>
  		<url-pattern>/LoginServlet</url-pattern>
	</servlet-mapping>
	<welcome-file-list>
  		<welcome-file>index.html</welcome-file>
  		<welcome-file>index.htm</welcome-file>
  		<welcome-file>index.jsp</welcome-file>
  		<welcome-file>default.html</welcome-file>
  		<welcome-file>default.htm</welcome-file>
  		<welcome-file>default.jsp</welcome-file>
 	</welcome-file-list>

</web-app>

(3)index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello World</title>
</head>
<body>
 	<a href="LoginServlet">LoginServlet</a>
</body>
</html>

结果:
点击链接
在这里插入图片描述
在这里插入图片描述

案例二(get 和post 提交流程,编码)

1、get和post的区别、乱码问题

1)get
url 会显示参数
数据的传递是有限的
method=“get”
get的编码是在tomcat/conf/server.xml里面解决的
2)post
method=“post”
参数在url里面看不到了
post编码问题的解决的
request.setCharacterEncoding(“UTF-8”);
3)jsp获取后台数据乱码解决
response.setContentType(“text/html;charset=UTF-8”);
4)jsp乱码问题的解决
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

2、实例

(1)web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
 	id="WebApp_ID" version="3.1">

	<display-name>web_servlet02</display-name>

	<servlet>
  		<servlet-name>LoginServlet</servlet-name>
  		<servlet-class>com.alex.web.servlet.LoginServlet</servlet-class>
 	</servlet>
 	<servlet-mapping>
  		<servlet-name>LoginServlet</servlet-name>
  		<url-pattern>/LoginServlet</url-pattern>
 	</servlet-mapping>

	<welcome-file-list>
  		<welcome-file>index.html</welcome-file>
  		<welcome-file>index.htm</welcome-file>
  		<welcome-file>login.jsp</welcome-file>
  		<welcome-file>default.html</welcome-file>
  		<welcome-file>default.htm</welcome-file>
  		<welcome-file>default.jsp</welcome-file>
 	</welcome-file-list>
</web-app>

(2)login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
 	Get
 	<form action="LoginServlet" method="get">
  		用户名:<input type="text" name="username" />
  		<br/>
  		密码:<input type="text" name="passwd" />
  		<br/>
  		<!-- 访问AutoByEclipseServlet中的doGet方法 -->
 		<input type="submit" value="发送GET请求" />
	</form>
 	<br />
 	<br />
 	POST
 	<form action="LoginServlet" method="post">
  		用户名<input type="text" name="username" />
  		<br/>
  		密码:<input type="text" name="passwd" />
  		<br/>
  		<!-- 访问AutoByEclipseServlet中的doPost方法 -->
  		<input type="submit" value="发送POST请求" />	
	</form>
</body>
</html>

(3)LoginServlet

package com.alex.web.servlet;
import java.io.IOException;
import java.util.Map;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletResponse;

//Servlet 对象时单例的,伪单例
//public class LoginServlet implements Servlet{
public class LoginServlet extends HttpServlet{

	//声明周期方法
 	//生命周期:表示对象从创建、初始化、使用、销毁过程

	private static final long serialVersionUID = 1L;

	//创建对象
 	public LoginServlet(){
  		System.out.println("LoginServlet.....");
 	}

	//销毁对象时使用
 	@Override
 	public void destroy() {
  		System.out.println("destroy ......");
 	}

	//初始化对象
 	//初始化方法只执行一次
 	@Override
 	public void init(ServletConfig servletconfig) throws ServletException {
  		System.out.println("init ... ...");
 	}

	//处理请求使用的
 	@Override
 	public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {

		//设置请求字符编码,解决客户端提交数据是中文乱码问题
  		//设置必须在request.getParameter(" ") 方法前调用,否则不起作用
  		//只针对post请求方式有效,对get请求方式无效
  		//如果解决Get请求乱码问题,需要在Tomcat/conf/server.xml中设置字符编码
  		//<Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000" redirectPort="8443"  URIEncoding="UTF-8"/>
  		request.setCharacterEncoding("UTF-8");

		//如何获取客户端浏览器的数据?
  		//一个参数名称带一个值,例如:文本框、密码框
  		String username = request.getParameter("username");
  		String passwd = request.getParameter("passwd");

		//一个参数名称带多个值,例如:复选框
  		//String[] values = request.getParameterValues("");

		//一次性获取所有请求参数,key为参数名称,值为参数名称对应的值
  		//Map<String, String[]> parameterMap = request.getParameterMap();

		System.out.println("username:" + username);
 		System.out.println("passwd:" + passwd);

		//服务器端告诉客户端浏览器,返回的是text/html类型的数据
  		//设置响应内容类型及编码,需要在response.getWriter().println("")方法调用前设置,否则不起作用
  		response.setContentType("text/html;charset=UTF-8");

		if("admin".equals(username) && "123".equals(passwd)){
   			response.getWriter().println("登录成功...");
  		}else{
   			response.getWriter().println("登录失败,用户名或者密码不正确");
  		}
 	}
}

结果:
用户名:admin
密码:123
在这里插入图片描述
发送get请求:
成功:
在这里插入图片描述
失败:
在这里插入图片描述
发送post请求:
成功:
在这里插入图片描述

失败:
在这里插入图片描述

案例三(转发与重定向)

1)请求的转发
(1)实现request.getRequestDispatcher("/regist_error.html").forward(request, response);
(2)特点
①在服务器内部完成,用户感知不到
②浏览器地址栏不变
③整个过程浏览器只发出了一个请求
④目标资源可以在WEB-INF目录下

2)请求的重定向
(1)实现
response.sendRedirect("./regist_success.html");
response.sendRedirect("/MyNews/regist_success.html");
response.sendRedirect(request.getContextPath() + “/MyNews/regist_success.html”);
(2)特点
①服务器以302状态码通知浏览器访问新地址
②浏览器地址栏改变
③整个过程浏览器发出两次请求
④目标资源不可以在WEB-INF目录下

LoginServlet:

package com.alex.web.servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
 	// 声明周期方法
 	// 生命周期:表示对象从创建、初始化、使用、销毁过程

	// 创建对象
 	public LoginServlet() {
  		System.out.println("LoginServlet.....");
 	}

	// 销毁对象时使用
 	@Override
 	public void destroy() {
  		System.out.println("destroy ......");
 	}

	// 初始化对象
 	// 初始化方法只执行一次
 	@Override
 	public void init(ServletConfig servletconfig) throws ServletException {
  		System.out.println("init ... ...");
 	}

	// 处理请求使用的
 	@Override
 	public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {

		// 设置请求字符编码,解决客户端提交数据是中文乱码问题
  		// 设置必须在request.getParameter(" ") 方法前调用,否则不起作用
  		// 只针对post请求方式有效,对get请求方式无效
  		// 如果解决Get请求乱码问题,需要在Tomcat/conf/server.xml中设置字符编码
  		// <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
  		// redirectPort="8443" URIEncoding="UTF-8"/>
  		request.setCharacterEncoding("UTF-8");
  
		// 如何获取客户端浏览器的数据?
  		// 一个参数名称带一个值,例如:文本框、密码框
  		String username = request.getParameter("username");
  		String passwd = request.getParameter("passwd");

		System.out.println("username:" + username);
  		System.out.println("passwd:" + passwd);

		// 服务器端告诉客户端浏览器,返回的是text/html类型的数据
  		// 设置响应内容类型及编码,需要在response.getWriter().println("")方法调用前设置,否则不起作用
  		response.setContentType("text/html;charset=UTF-8");

		if ("admin".equals(username) && "123".equals(passwd)) {
   			// 转发请求
   			// 转发请求资源的路径,以斜杠开头,表示从当前应用程序的根路径来查找资源
   			// XML配置文件中以斜杠开头,也表示从当前应用程序的根路径来查找资源
   			request.getRequestDispatcher("/success.jsp").forward(request, response);
  		} else {
   			// 转换为子接口,子接口内容更丰富一些
   			HttpServletRequest httpServletRequest = (HttpServletRequest)request;
   			HttpServletResponse httpServletResponse = (HttpServletResponse) response;
   			//httpServletRequest.getContextPath() 方法获取当前应用程序的上下文路径
   			// URL : http://localhost:8080/web_servlet04/login.jsp
   			// URI : /web_servlet04/login.jsp
   			// getContextPath() : /web_servlet04
   			httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/failure.jsp");
  		}
 	}
}

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
 	id="WebApp_ID" version="3.1">
 	<display-name>web_servlet04</display-name>

	<servlet>
  		<servlet-name>LoginServlet</servlet-name>
  		<servlet-class>com.alex.web.servlet.LoginServlet</servlet-class>
 	</servlet>
 	<servlet-mapping>
  		<servlet-name>LoginServlet</servlet-name>
  		<url-pattern>/LoginServlet</url-pattern>
 	</servlet-mapping>

	<welcome-file-list>
  		<welcome-file>index.html</welcome-file>
  		<welcome-file>index.htm</welcome-file>
  		<welcome-file>login.jsp</welcome-file>
  		<welcome-file>default.html</welcome-file>
  		<welcome-file>default.htm</welcome-file>
  		<welcome-file>default.jsp</welcome-file>
 	</welcome-file-list>

</web-app>

login.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
 	Get
 	<form action="LoginServlet" method="get">
  		用户名:<input type="text" name="username" />
  		<br/>
  		密码:<input type="text" name="passwd" />
  		<br/>
  		<!-- 访问AutoByEclipseServlet中的doGet方法 -->
  		<input type="submit" value="发送GET请求" />
 	</form>
 	<br />
 	<br /> 
 	POST
 	<form action="LoginServlet" method="post">
  		用户名<input type="text" name="username" />
  		<br/>
  		密码:<input type="text" name="passwd" />
  		<br/>
  		<!-- 访问AutoByEclipseServlet中的doPost方法 -->
  		<input type="submit" value="发送POST请求" />
 	</form>
</body>
</html>

success.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
success
</body>
</html>

failure.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
failure
</body>
</html>

结果:
在这里插入图片描述

成功:
在这里插入图片描述
在这里插入图片描述

失败:
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Web 学习笔记 06 Servlet 案例(get、post,转发与重定向) 的相关文章

  • 网页空间和服务器,服务器内存和网页空间

    服务器内存和网页空间 内容精选 换一换 使用主机迁移服务前 请参考以下步骤准备好账号 权限及源端 目的端服务器环境 已在华为云注册账号 并完成实名认证 已获取账号迁移权限 如果使用账号登录 默认拥有迁移权限 可无需配置迁移权限 如果使用IA

随机推荐

  • R notes (1): lm()

    R notes lm Reference Fitting Linear Models Usage Arguments Details Reference https www rdocumentation org packages stats
  • 2023最新版本Activiti7系列-身份服务

    身份服务 在流程定义中在任务结点的 assignee 固定设置任务负责人 在流程定义时将参与者固定设置在 bpmn 文件中 如果临时任务负责人变更则需要修改流程定义 系统可扩展性差 针对这种情况可以给任务设置多个候选人或者候选人组 可以从候
  • 第三代oid铺码软件_你好点读笔!自制小达人点读目录册之书名贴铺码

    之前跟大家分享了一下关于如何铺码的内容 你好点读笔 自制小达人点读目录册之如何铺码 主要是以铺 内容贴 码为例进行的 今天 我要和大家分享的是和 内容贴 密不可分的 书名贴 铺码的原理和之前内容码铺码原理和步骤基本一致 那么接下来 请随我一
  • 【DDIM加速采样方法】公式推导加代码分析。Denoising Diffusion Implicit Models

    DDIM加速采样方法 公式推导加代码分析 Denoising Diffusion Implicit Models 1 前言 ddim总览 2 均值 mu 3 方差 sigma
  • 华为od机试 java 地址分割

    题目 你的任务是编写一个程序 该程序将接收一个由逗号分隔的字符串 其中包含一个URL的前缀和后缀 然后将它们合并成一个完整的URL 合并规则如下 如果前缀的最后一个字符是斜杠 则删除它 如果后缀的第一个字符是斜杠 则删除它 在处理过的前缀和
  • 待续----serialVersionUID的解释

    serialVersionUID作用 序列化时为了保持版本的兼容性 即在版本升级时反序列化仍保持对象的唯一性 有两种生成方式 一个是默认的1L 比如 private static final long serialVersionUID 1L
  • configtx.yaml中文详解(Hyperledger Fabric 区块链网络运维工具configtxgen的配置文件)

    configtx yaml是Hyperledger Fabric区块链网络运维工具configtxgen用于生成通道创世块或通道交易的配置文件 configtx yaml的内容直接决定了所生成的创世区块的内容 本文将给出configtx y
  • [899]数值特征-对数据进行log变化

    对于一些标签和特征来说 分布不一定符合正态分布 而在实际的运算过程中则需要数据能够符合正态分布 因此我们需要对特征进行log变化 使得数据在一定程度上可以符合正态分布 进行log变化 就是对数据使用np log data 1 加上1的目的是
  • Redis下载部署并加入idea应用(详细笔记)

    文章目录 前言 一 下载Window版本的redis 1 打开网址 github上的redis安装包 https github com microsoftarchive redis 找到Redis on Windows 点击 release
  • java stream流常用方法

    Stream流用法 1 分组 2 过滤 3 List map互转 4 求和 极值 5 求最大 最小值的对象 6 去重 7 排序 8 拼接 9 统计 10 平均值 11 某个值的数量 12 分区 13 截断 14 跳过 15 查找与匹配 16
  • Unity Shader入门精要第四章:Unity Shader 的内置变量(数学篇)

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一 4 8 1 变换矩阵 二 4 8 2 摄像机和屏幕参数 4 9 答疑解惑 扩展阅读 参考 前言 使用Unity 写Shader 的一个好处在于 它提供了很多内置的参数 这使
  • typora+pandoc:markdown文本转换成word(也可把word转换成markdown哦)

    因为想把自己写的博客转换成word 博客是markdown格式 公式什么的又懒得在word里面敲第二遍 于是就找了个方法让 md文本与 doc文本转换 反之也可把word转换成markdown哦 教程附后 markdown文本转换成word
  • SyntaxError: Cannot use import statement outside a module

    SyntaxError Cannot use import statement outside a module 错误展示 问题 使用 vs code 调试js 代码 出现 SyntaxError Cannot use import sta
  • Maven的从入门到精通(完结篇)

    Maven的从入门到精通 完结篇 一 maven工程运行调试 1 1 端口占用处理 1 2 断点测试 二 总结 2 1 maven仓库 2 2 常用的maven命令 2 3 坐标定义 2 4 pom 基本配置 本文是Maven学习中的完结篇
  • (转载)Flutter、Weex、React Native和Android原生对比报告

    Flutter Weex React Native和Android原生对比报告 Zhang Jun的博客 CSDN博客
  • docker 通过中间镜像加速部署

    概要 实施 修改前的实施时间 制作编译用的镜像 测试修改后的实施时间 概要 使用 docker 打包镜像的时候 每次耗费时间最多的就是 docker build 的过程 特别是对于前端工程的打包 有时候下载依赖包的时间就要 10 几分钟 这
  • MySql数据库实验知识点:

    实验一 创建以下数据库和表 并查看是否成功创建 目的与要求 1 了解 mysql 数据库的存储引擎分类 2 了解表的结构特点 3 了解 mysql 的基本数据类型 4 了解空值概念 5 学会使用 sql 语句创建数据库和表 实验内容 1 实
  • nginx高性能原因

    epoll多路复用 BIO 堵塞式IO 缺点 client和server一旦建立连接 就可以建立通信套接字在这个通信套接字上进行读写操作 此时不能再接收其他客户端连接请求 只能等待同当前连接的客户端的操作执行完成 select模型 缺点 变
  • 第四章 神经网络知识扩展

    1 其他的神经网络学习算法 1 1介绍 梯度下降算法并不是神经网络的唯一算法 还有其他算法 我们喜欢称他们为优化器 Optimizer 优化器就是优化网络的机器 主要有以下几种 1 2SGD优化器 SGD优化器全称为随机梯度下降算法 可以简
  • Java Web 学习笔记 06 Servlet 案例(get、post,转发与重定向)

    Servlet 案例 get post 转发与重定向 案例一 初体验 Servlet web项目 案例二 get 和post 提交流程 编码 1 get和post的区别 乱码问题 2 实例 案例三 转发与重定向 案例一 初体验 Servle