JavaEE学习笔记 2024-1-12 --Tomcat服务器、Servlet

JavaEE

个人整理非商业用途,欢迎探讨与指正!!
JavaEE是企业级开发
是综合性非常强的阶段
 包含的知识点:JavaSE,MySQL,JDBC,WEB(HTML,CSS,JS,前端框架),Servlet,JSP,XML,AJAX等技术


目录

  • JavaEE
    • 1.服务器
    • 2.Tomcat服务器
      • 2.1Tomcat的使用
      • 2.2Tomcat的目录结构
      • 2.3Tomcat的启动和关闭
      • 2.4eclipse下配置tomcat
    • 3.Servlet的基本使用
      • 3.1编写第一个Servlet程序
      • 3.2Servlet的访问
      • 3.3Servlet的配置
      • 3.4Servlet配置需要注意的问题
      • 3.5Servlet的版本变化
        • 3.5.1Servlet接口
        • 3.5.2GenericServlet抽象类
        • 3.5.3HttpServlet抽象类
    • 4.GET和POST请求
      • 4.1发送GET请求
      • 4.2发送POST请求
    • 5.Servlet中的核心对象
      • 5.1HttpServletRequest对象
      • 5.2通过request获取表单中的请求参数
      • 5.3常见的HTTP状态码
      • 5.4request中的乱码问题处理
      • 5.5HttpServletResponse对象


1.服务器

JavaEE项目需要运行在服务器之上
WEB服务器就是WEB项目的容器,WEB项目的运行环境,将项目部署到服务器下,可以通过服务器路径给用户直接浏览访问
静态资源
 网页中保持不变的,没有后端请求的(HTML/CSS/JS/图片等)
动态资源(WEB服务器上运行动态资源)
 会随着不同的请求,发生不同的变化

常见开发中的服务器产品
 Tomcat(apache开源服务器,与sun公司合作,主流的web服务器之前,springboot中内置的服务器)
 Jetty(效率比tomcat要高,安装相比tomcat麻烦一些)
 WebLogic(Oracle 收费)
 WebSphere(IBM服务器)
 Nginx(静态资源服务器)

2.Tomcat服务器

Apache的开源项目,tomcat是开源免费的,因为和sun公司进行合作,支持最新的JSP和Servlet的语法
企业中主流的使用Tomcat8.5和Tomcat9版本(Tomcat10也有使用)
各版本之间最大的差别是对Servlet(运行在服务器下的Java类)的规范支持
Tomcat有安装版和解压版的区别
 (目录结构是一样的,以及后面的搭建方式是相同的,本次课程给大家提供的是Tomcat8.5解压版)

2.1Tomcat的使用

开箱即用
 注意:开箱时目录的层级不要太多,开箱路径中不要有中文
 例如:D:\apache-tomcat-8.5.20\apache-tomcat-8.5.20

2.2Tomcat的目录结构

bin 存放服务器启动和关闭相关的二进制文件
conf tomcat的配置相关文件(server.xml可以配置当前服务器的端口等信息,web.xml当前服务器的全局文件)
lib tomcat是java开发的,lib中存放的是支持的jar环境
logs 存放日志文件,服务器相关的各种信息
temp 临时文件夹
webapps 管理web项目的,默认情况下web项目要部署到该路劲下(eslipse需要手动配置,idea可以自动配置)
work 存web项目的动态页面(JSP:Java Server Page)转换的java文件的

2.3Tomcat的启动和关闭

startup.bat 启动服务器 关闭则可以直接关闭服务器
 不能同一个端口启动多次(一个端口只能启动一次)
tomcat若无法启动,则需要查看JDK的环境变量是否正常配置,tomcat是由java开发的
 必须有正确的JAVA_HOME配置

2.4eclipse下配置tomcat





3.Servlet的基本使用

Servlet是JavaEE规范的一部分,Servlet需要JavaEE的环境支持
 环境支持:JDK环境,服务器环境
Servlet是一个运行在服务器下的类,由服务器进行创建对象
 Servlet的本质是Java类

3.1编写第一个Servlet程序

// 外部(浏览器)访问我们Servlet的路径
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		System.out.println("你访问到我了呦");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		System.out.println("你访问到我了呦");
	}
}

3.2Servlet的访问

1.在服务器下启动当前的项目
 Run On Server --> finsh 服务器和项目一起被启动了,项目可以被访问了
2.访问路径
 http://localhost:8080/20240112-01-HelloServlet/HelloServlet
 当前地址表示着访问服务器下的Servlet类

3.3Servlet的配置

在Servlet3.0后有两种配置方案:
1.基于注解的方式(更加便捷,更加方便)
 @WebServlet(路径)
  路径是必须由/开始
 注解是将Java类配置到服务器下,可以被直接访问(浏览器访问服务器,然后读取到了一个Java类)

2.基于配置文件的方式
 web.xml文件,该文件每个项目都只有一个
 在WebContent/WEB-INF/web.xml文件中进行配置

xml文件是和html同公司(www3cSchool)发布的产品,特点都是由标签组成(标记,节点)
xml的特点是区分大小写,所有标签必须是闭合的(双标签<xx></xx> 单标签<xx/>)
xml中只有一个根节点
xml最初被创建的作用是数据传输的,但是xml特别的笨重
xml现在多用于配置文件
<!-- 使用xml的形式进行配置servlet -->
<!-- 注册Servlet -->
<servlet>
    <!-- 名字任意 -->
    <servlet-name>ok</servlet-name>
    <!-- 需要被注册的servlet -->
    <servlet-class>com.qf.servlet.OkServlet</servlet-class>
</servlet>
<!-- 映射,外部的访问方式 -->
<servlet-mapping>
    <!-- 名字和上面一样 -->
    <servlet-name>ok</servlet-name>
    <!-- 外部的访问路径 -->
    <url-pattern>/ok</url-pattern>
</servlet-mapping>

3.4Servlet配置需要注意的问题

url-pattern不能重复
url-pattern必须以/开头

3.5Servlet的版本变化

接口版本
 Servlet
模板化抽象类版本
 GenericServlet
Http协议抽象类版本(自动生成的版本)
 HttpSerlet

3.5.1Servlet接口

Servlet接口中包含了Servlet生命周期相关方法(4个)(来到没的过程)
1.构造方法 只调用一次,服务器创建的同时为Servlet创建对象
2.初始化方法 只调用一次,用于对当前的Servlet进行初始化信息
3.服务方法 可以调用多次,每次的浏览器的访问都会调用一次(请求的过程)
4.销毁方法 只调用一次,服务器正常终止时调用,或者源码改变时调用

@WebServlet("/my")
public class MyServlet implements Servlet{
	public MyServlet() {
		System.out.println("构造方法");
	}

	@Override
	public void destroy() {
		System.out.println("销毁方法");
	}

	@Override
	public ServletConfig getServletConfig() {
		System.out.println("servlet配置");
		return null;
	}

	@Override
	public String getServletInfo() {
		System.out.println("servlet信息");
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		System.out.println("初始化方法");
	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		System.out.println("服务方法");
	}
}
3.5.2GenericServlet抽象类

抽象类中将Servlet接口进行实现,只预留一个service抽象方法,将冗余代码简单化

public class LoginServlet extends GenericServlet{

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		System.out.println("嗨嗨嗨");
	}
}
3.5.3HttpServlet抽象类

没有任何的抽象方法,就是用于被继承
HttpServlet是针对HTTP协议定制的,内部将service方法根据不同的请求方式分割为不同的doXxx方法
 doXxx针对get/post等请求定制
  例如:doGet方法接收get请求,doPost方法接收post请求
 doXxx方法中,将ServletRequest和ServletResponse
  转换为HttpServletRequest和HttpServletResponse

@WebServlet("/hello")
public class HelloServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("get请求");
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("post请求");
	}
}

将service进分割

public class LoginServlet extends GenericServlet{

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
//		将ServletRequest和ServletResponse转换为HttpServletRequest和HttpServletResponse
		HttpServletRequest request = (HttpServletRequest) arg0;
		HttpServletResponse response = (HttpServletResponse) arg1;
//		将service分割为不同的doXxx方法
//		获取请求方式
		String method = request.getMethod();
		System.out.println("请求方式:"+method);
		switch (method) {
		case "GET":
			doGet(request,response);
			break;
		case "POST":
			doPost(request,response);
		default:
			break;
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我处理post请求");
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我处理get请求");
	}

}
// 使用我们自己的分割方案
@WebServlet("/ok")
public class OkServlet extends LoginServlet{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我是ok中get请求");
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("我是ok中的post请求");
	}
}

4.GET和POST请求

浏览器向服务器发送请求的主要方式:GET和POST

4.1发送GET请求

1.浏览器地址栏
2.超链接
3.form的默认方式(method=get)
4.url重写的方式,使用? = &进行url拼接

浏览器地址栏
	http://localhost:8080/20240113-03-GET%E5%92%8CPOST%E8%AF%B7%E6%B1%82/LoginServlet
超链接
    <!-- href指向urlpattren  -->
    <a href="LoginServlet">跳转</a>
method=get
	<!-- action指向urlpattern -->
    <form action="LoginServlet" method="get">
        <input type="submit">
    </form>
url重写
	http://localhost:8080/20240113-03-GET%E5%92%8CPOST%E8%AF%B7%E6%B1%82/LoginServlet?username=tom&password=123

4.2发送POST请求

form的method=post

<!-- action指向urlpattern -->
<form action="LoginServlet" method="post">
	<input type="submit" value="POST">
</form>

5.Servlet中的核心对象

主要有两个:
 HttpServletRequest和HttpServletResponse
 代表着请求和响应

5.1HttpServletRequest对象

该对象由服务器进行创建并赋值
request中封装了所有的请求信息

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
    public LoginServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
//		request封装了所有的请求数据
		String method = request.getMethod();
		System.out.println("请求方式:"+method);
//		请求的url
		StringBuffer requestURL = request.getRequestURL();
		System.out.println(requestURL);
//		url后的参数
		String queryString = request.getQueryString();
		System.out.println(queryString);
//		通过url中的key获取对应的value key就是请求路径中的? key = value & xxx = xxx
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		System.out.println(username+":"+password);
		String gender = request.getParameter("gender");
		System.out.println(gender);
//		获取协议的版本
		String protocol = request.getProtocol();
		System.out.println(protocol);
		String remoteAddr = request.getRemoteAddr();
		System.out.println(remoteAddr);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//		没有特殊要求的情况下,我们的所有请求的处理方案是一样的(REST风格的URL,对请求方式有特殊的说明)
		doGet(request, response);
	}
}
//http://localhost:8080/20240115-04-Servlet%E4%B8%AD%E6%A0%B8%E5%BF%83%E5%AF%B9%E8%B1%A1/LoginServlet?username=tom&password=123&gender=%E7%94%B7

5.2通过request获取表单中的请求参数

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //		form中通过name或者value
    String departmentname = request.getParameter("departmentname");
    String local = request.getParameter("local");

    //		封装起来
    Department dept = new Department(0,departmentname,local);

    System.out.println(dept);

    //		完成JDBC操作,添加数据添加到数据库中(作业)
}
<form action="AddDeptServlet" method="get">
	<!-- name属性用于后端取值使用 例如:name=local 将会拼接数据为local=xxx的形式-->
	部门名称:<input type="text" name="departmentname"><br>
	部门地址:<input type="text" name="local"><br>
	<input type="submit" value="添加">
</form>

5.3常见的HTTP状态码

200表示成功
302表示服务器重定向
304表示服务器缓存资源
404表示资源不存在,4xx就是浏览器资源错误
500表示服务器端错误,5xx表示服务器端资源错误

5.4request中的乱码问题处理

get请求
 tomcat7之后,所有的中文是默认处理完的
post请求
 需要对request对象进行编码集的设置

//		设置请求的编码格式
request.setCharacterEncoding("utf-8");

5.5HttpServletResponse对象

封装了所有的响应信息

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    //		设置请求和响应的编码格式
    request.setCharacterEncoding("utf-8");
    response.setCharacterEncoding("utf-8");
    response.setContentType("text/html; charset=utf-8");

    //		所有通过请求获取的参数类型都是String
    String username = request.getParameter("username");
    String password = request.getParameter("password");

    //		使用response获取到页面的打印流
    PrintWriter out = response.getWriter();

    //		常规应该做JDBC操作
    if("王成輝".equals(username) && "123456".equals(password)) {
        //			System.out.println("登录成功");
        //			一般不会使用打印流 打印过多的内容
        //			out.print("<label style='color:green;'>登录成功</label>");
        //			页面跳转
        response.sendRedirect("success.html");
    }else {
        //			System.out.println("登录失败");
        //			out.print("<label style='color:red;'>登录失败</label>");
        response.sendRedirect("fail.html");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/331848.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【驱动】I2C驱动分析(二)-驱动框架

I2C驱动框架简介 I2C 驱动属于总线-设备-驱动模型的&#xff0c;与I2C总线设备驱动模型相比&#xff0c;大体框架是一样&#xff0c;系统的整体框架如下所示。 最上层是应用层&#xff0c;在应用层用户可以直接用open read write对设备进行操作&#xff0c;往下是设备驱动层&a…

SpringBoot 中使用 Quartz 创建定时任务

文章目录 一、使用示例二、运行原理 一、使用示例 自定义 job&#xff1a; Slf4j public class MyJob extends QuartzJobBean {Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {log.info("MyJob start...");l…

【unity】麦克风声音驱动,控制身体做出不同动作

1.在角色对象上挂在animator组件&#xff0c;并将动作控制器与其关联 2.在角色对象上挂在audio source组件。 3.新建voice control脚本&#xff0c;编写代码如下&#xff1a; using System; using System.Collections; using System.Collections.Generic; using UnityEngine;…

【OJ】牛客链表刷题

题目 1. 链表分割1.1 题目分析1.2 代码 2. 链表的回文结构2.1 题目分析2.2 代码 这里两道与链表有关的题目均来自牛客。 1. 链表分割 1.1 题目分析 因为这里代码不能选择用c语言写&#xff0c;所以选择用c,因为c兼容c。 题目要求分割链表&#xff0c;我们可以直接弄成两个带哨…

Codeforces Round 915 (Div. 2) D题 单调栈,特殊情况入手

Problem - D - Codeforces 目录 题意&#xff1a; 思路&#xff1a; 把0放后面&#xff1a; ———— 然后看懂下面思路&#xff0c;理解单调栈&#xff1a; 细节&#xff1a; 核心代码&#xff1a; 题意&#xff1a; mex指的是该数组缺的最小的自然数&#xff0c;例如…

2024最有发展潜力的代理项目!格行随身wifi代理项目分析测评,轻资产靠谱创业项目推荐

最近很多网友都有创业的想法&#xff0c;身边创业的朋友也不在少数&#xff0c;当然有成功的&#xff0c;也有亏的血本无归的。最近网上也有很多适合新手的创业或代理项目&#xff0c;什么单身经济啊&#xff0c;大健康啊还有创业圈一直在讨论的随身WiFi代理等。当然一些创投圈…

大文件的断点续传如何实现

断点续传 断点续传是一种数据恢复技术&#xff0c;主要用于在读取或发送数据时&#xff0c;因为网络问题、磁盘问题等原因导致数据传输中断。断点续传技术允许你在已经传输的数据基础上继续传输&#xff0c;从而节省数据传输时间。 断点续传通常用于文件传输过程中&#xff0c;…

由于找不到d3dcompiler_43.dll缺失,无法打开软件的解决方法分享

d3dcompiler43.dll是什么文件&#xff1f;为什么会出现丢失的情况&#xff1f;又该如何解决呢&#xff1f;本文将详细介绍d3dcompiler43.dll的作用和影响&#xff0c;并提供6个有效的解决方法。 一、d3dcompiler43.dll是什么文件&#xff1f; d3dcompiler43.dll是DirectX SDK…

SQL注入入门进阶_报错注入、延时注入、python脚本盲注

SQL注入入门进阶 学习目标 本篇文章入门SQL注入&#xff0c;除了回显的SQL注入还存在报错注入、布尔盲注和延时注入。如果sqlmap跑不出来的还可以使用burp intrude注入或者使用python编写脚本注入。 报错注入 concat() 函数的意思是讲&#xff0c;全部内容连成一个字符串&a…

书生·浦语大模型实战营第五节课笔记及作业

LMDeploy 大模型量化部署实践 1 大模型部署背景 1.1 模型部署及大模型特点 1.2 大模型部署挑战及方案 2 LMDeploy简介 2.1 核心功能-量化 2.2 核心功能-推理引擎TurboMind 2.1 核心功能-推理服务api server 3 动手实践及作业 按照文档LMDeploy 的量化和部署中的步骤在Intern…

【MIdjourney】一些材质相关的关键词

1.多维剪纸(Multidimensional papercut) "Multidimensional papercut"&#xff08;多维剪纸&#xff09;是一种剪纸艺术形式&#xff0c;通过多层次的剪纸技巧和设计来创造出立体感和深度感。这种艺术形式通常涉及在不同的纸层上剪裁不同的图案&#xff0c;并将它们…

鸿蒙开发-UI-布局-线性布局

鸿蒙开发-序言 鸿蒙开发-工具 鸿蒙开发-初体验 鸿蒙开发-运行机制 鸿蒙开发-运行机制-Stage模型 鸿蒙开发-UI 鸿蒙开发-UI-组件 鸿蒙开发-UI-组件-状态管理 鸿蒙开发-UI-应用-状态管理 鸿蒙开发-UI-渲染控制 鸿蒙开发-UI-布局 文章目录 前言 一、基本概念 二、布局子元素 1.子元…

大模型基础2

大模型基础2 第二章&#xff1a;大模型的能力 语言模型的适应性&#xff1a;从语言模型到任务模型的转化 语言模型转化为任务模型的过程称为"适应"&#xff1a; 任务的自然语言描述一组训练实例&#xff08;输入-输出对&#xff09; 进行适应的两个种方法&#xf…

OSI七层协议和五层协议

【 1 】互联网协议交互的基础 硬件设备 光缆 【 2 】OSI七层协议 物理层&#xff08;Physical Layer&#xff09;&#xff1a;负责传输比特流&#xff08;0和1&#xff09;以及物理连接的建立和维护。数据链路层&#xff08;Data Link Layer&#xff09;&#xff1a;提供可…

禅道下载安装及基本使用(项目周期管理)实施必会!!!

文章目录 前言&#xff1a;一、为什么要使用禅道&#xff1f;二、禅道的下载与安装 前言&#xff1a; 禅道的使用能使公司提高项目管理效率、促进团队协作、支持敏捷开发&#xff0c;并可根据具体需求进行个性化配置。 本文章博主将以一个项目周期来带你们了解禅道。 一、为什…

企业信息防泄漏管理的理念是什么?

在这个数字化的时代&#xff0c;信息数据的安全已经成为企业发展的关键要素。随着网络技术的飞速发展&#xff0c;信息安全的重要性日益凸显&#xff0c;它关乎企业的生死存亡。在企业的信息系统中&#xff0c;信息泄露是最常见和最严重的风险之一。因此&#xff0c;建立一套全…

django后台进行加密手机号字段,加密存储,解密显示

需求: 1 &#xff1a;员工在填写用户的手机号时&#xff0c;直接填写&#xff0c;在django后台中输入 2&#xff1a;当员工在后台确认要存储到数据库时&#xff0c;后台将会把手机号进行加密存储&#xff0c;当数据库被黑之后&#xff0c;手机号字段为加密字符 3&#xff1a;员…

Flutter编译报错Connection timed out: connect

背景&#xff1a;用Android Studo 创建了Flutter项目&#xff0c;编译运行报错java.net.ConnectException: Connection timed out: connect 我自己的环境&#xff1a; windows11 Android Studio Flutter 截图如下&#xff1a; 将错误日志展开之后&#xff1a; Exception…

银行家算法

文章目录 主要内容一.银行家算法1.需求分析 2.概要设计3.源代码代码如下&#xff08;示例&#xff09;: 总结 主要内容 一.银行家算法 1.需求分析 通过编写和调试一个系统动态分配资源的简单模拟程序&#xff0c;观察死锁产生条件&#xff0c;采用适当的算法&#xff0c;有效…

Java并发编程: 并发编程中的ExecutionException异常

一、什么是ExecutionException 在并发编程中在执行java.util.concurrent.Future实现类的get方法时&#xff0c;需要捕获java.util.concurrent.ExecutionException这个异常。Future.get()方法通常是要获取任务的执行结果&#xff0c;当执行任务的过程中抛出了异常&#xff0c;就…