B032-服务器 Tomcat JavaWeb项目 Servlet

目录

      • 服务器
        • 服务器的认识
      • Tomcat服务器
        • Tomcat服务器的介绍
        • Tomcat的安装
        • Tomcat报错的情况
        • Tomcat要启动成功的条件
      • JavaWeb项目
        • Web的项目结构
        • 发布项目的第一种方式
        • 发布项目的第二种方式
      • Eclipse中搭建动态Web项目
      • eclipse安装Tomcat插件
      • servlet
        • servlet示例
        • servlet的执行流程
        • servlet分析
        • servlet的生命周期
        • ServletConfig
        • get和post的区别
        • HttpServletRequest对象
        • HttpServletResponse对象

服务器

服务器的认识

在这里插入图片描述
java代码要用web服务器运行起来,才能被浏览器访问的到。

Tomcat服务器

Tomcat服务器的介绍
  1. web服务器:用来运行我们的web(java)项目。运行起来我们的项目才能被浏览器(不仅仅是我自己的浏览器同一个局域网其他的也行)访问
  2. 开源、免费、轻量级
  3. 基于java代码写的,运行时需要java环境
    A:编辑环境变量,JAVA_HOME,(jdk的安装目录)
    B:path里面编辑一个值,%JAVA_HOME%\bin
    Jdk1.8只需要配置这么多就行了
Tomcat的安装

解压即安装
在这里插入图片描述

Tomcat报错的情况
  1. 端口被占用
  2. 写了中文但server.xml不是utf-8的编码 (记事本选文件选另存为选UTF-8)
Tomcat要启动成功的条件
  1. 下载tomcat8解压(不需要安装 不用配置tomcat的环境变量)
  2. 一定要有java环境,其中一定要有JAVA_HOME,jdk版本要对 ( java -version (cmd) )
  3. 其他起来里面报404是因为webapps里没有文件,如果里面有文件还是报404,可能是改了配置文件(重新解压原来的tomcat)

JavaWeb项目

Web的项目结构

在这里插入图片描述
web.xml可以不要,也可以去tomcat里面找

发布项目的第一种方式

html文件挡在项目根目录里面(与WEB-INF同级)
启动tomcat,访问http://localhost:8080/OA/test.html
不推荐

发布项目的第二种方式

在这里插入图片描述

Eclipse中搭建动态Web项目

1.新建动态web项目,项目名称随便写
在这里插入图片描述
2.定义字节码文件存放的位置
在这里插入图片描述
3.内容目录与前面对应,勾选创建web.xml
在这里插入图片描述
4.把Html文件放入webapp目录里
5.把该项目webapp的路径放入Tomcat的server.xml里
启动Tomcat
访问http://localhost:8080/test3.html

tips:
动态的web项目可以写jsp java代码,静态项目只能写html

新建项目后未能显示:下三角标 - Select Working Set - edit - add

WEB-INF下的classes是放字节码文件的 eclipse默认不显示,只有不显示才是正常的(害怕你删字节码文件)
我们可以之间去工作空间看classes文件是否存在

eclipse安装Tomcat插件

上面这种方式比较麻烦,每次都要去tomcat的安装目录里去启动,我们可以在eclipse里安装和配置Tomcat插件来方便操作,方式如下

1.把以下插件文件放到Eclipse文件夹下的plugins文件夹里,然后重启
在这里插入图片描述
2.把插件关联到Tomcat
在这里插入图片描述

servlet

servlet示例

上述只能访问html,不能访问java,如果要访问java,必须要用servlet

导包
在这里插入图片描述
tips:

如何导入并查看源码?
见视频

eclipse输入提示怎么打开?
打开Eclipse并点击顶部菜单栏上的“Window”菜单项。
在下拉菜单中,选择“Preferences”选项。
在打开的窗口中,导航到“Java” > “Editor” > “Content Assist”。
在右侧窗格中,找到“Auto Activation”部分,并勾选“Enable auto activation”复选框。
在“Auto Activation triggers for Java”字段中,输入字符(“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.”),用于触发代码提示。您可以输入多个字符,但请注意不要删除现有字符。
单击“OK”按钮保存更改。

HttpServletTest

public class HttpServletTest extends HttpServlet {@Overridepublic void init() throws ServletException {// TODO Auto-generated method stubsuper.init();System.out.println("初始化");}@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubsuper.service(req, resp);System.out.println("服务");}@Overridepublic void destroy() {// TODO Auto-generated method stubsuper.destroy();System.out.println("销毁");}
}

servlet建好后,需要用web.xml来访问

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"><display-name>TomcatAndservlet</display-name><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><servlet><servlet-name>HttpServlet</servlet-name><servlet-class>com.itsource.servlet._02HttpServlet.HttpServletTest</servlet-class></servlet><servlet-mapping><servlet-name>HttpServlet</servlet-name><url-pattern>/xx</url-pattern></servlet-mapping>
</web-app>

访问:localhost/xx

servlet的执行流程

在这里插入图片描述

servlet分析

1.servlet的作用就是让我们的浏览器能访问到java代码
2.servlet是规范,java不去实现,由各大服务器厂商去实现
3.所以tomcat里面就有对servlet的实现包 jar

servlet的生命周期

在这里插入图片描述
LifeServlet

public class LifeServlet extends HttpServlet{public LifeServlet(){System.out.println("出生");}@Overridepublic void init() throws ServletException {System.out.println("取名,上户口");}@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("工作");}@Overridepublic void destroy() {System.out.println("立遗嘱,正常死亡");}
}

web.xml

  <servlet><servlet-name>LifeServlet</servlet-name><servlet-class>com.itsource.servlet._03LifeServlet.LifeServlet</servlet-class></servlet><servlet-mapping><servlet-name>LifeServlet</servlet-name><url-pattern>/xxx</url-pattern></servlet-mapping>

启动tomcat,浏览器多次访问http://localhost/xxx,正常停止tomcat,看控制台

信息: Server startup in 632 ms
出生
取名,上户口
工作
工作
工作
十一月 20, 2023 3:20:25 下午 org.apache.catalina.core.StandardServer await
信息: A valid shutdown command was received via the shutdown port. Stopping the Server instance.
十一月 20, 2023 3:20:25 下午 org.apache.coyote.AbstractProtocol pause
信息: Pausing ProtocolHandler ["http-nio-80"]
十一月 20, 2023 3:20:25 下午 org.apache.coyote.AbstractProtocol pause
信息: Pausing ProtocolHandler ["ajp-nio-8009"]
十一月 20, 2023 3:20:26 下午 org.apache.catalina.core.StandardService stopInternal
信息: Stopping service Catalina
立遗嘱
十一月 20, 2023 3:20:26 下午 org.apache.catalina.core.ApplicationContext log
信息: SessionListener: contextDestroyed()

< load-on-startup >:启动tomcat时即执行了构造与初始化方法,后面访问只会执行service方法
放在< servlet-class >下面,值不为负数,数值越大优先级越高

  <servlet><servlet-name>LifeServlet</servlet-name><servlet-class>com.itsource.servlet._03LifeServlet.LifeServlet</servlet-class><load-on-startup>0</load-on-startup></servlet><servlet-mapping><servlet-name>LifeServlet</servlet-name><url-pattern>/xxx</url-pattern></servlet-mapping>

两种说法
在这里插入图片描述

ServletConfig

可以拿到配置参数,了解即可,有时候可以用来解决硬编码的问题,比如设置字符编码集

web.xml

  <servlet><servlet-name>LifeServlet</servlet-name><servlet-class>com.itsource.servlet._03LifeServlet.LifeServlet</servlet-class><init-param><param-name>encode</param-name><param-value>UTF-8</param-value></init-param><load-on-startup>0</load-on-startup></servlet><servlet-mapping><servlet-name>LifeServlet</servlet-name><url-pattern>/xxx</url-pattern></servlet-mapping>

LifeServlet

	@Overridepublic void init(ServletConfig config) throws ServletException {System.out.println(config.getServletName());System.out.println(config.getInitParameter("encode"));System.out.println("init...");;}
get和post的区别

可以用@WebServlet注解取代在web.xml里配置servlet,简化编写流程

@WebServlet("/web")
public class MethodServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("get方法");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("post方法");}
}

webapp下新建User.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><form action="/web" method="get">账号:<input type="text" name="name"><br>密码:<input type="password" name="password"><input type="submit" value="get"></form><br><form action="/web" method="post">账号:<input type="text" name="name"><br>密码:<input type="password" name="password"><input type="submit" value="post"></form>
</body>
</html>

浏览器访问测试:http://localhost/User.html,两个按钮会走到对应的方法

doGet方法和doPost方法可以合并为service方法,不管post或get请求,都会走service方法

@WebServlet("/web")
public class MethodServlet extends HttpServlet{@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("我是service...");}
}
HttpServletRequest对象

可以拿到请求里的各种信息

@WebServlet("/web")
public class MethodServlet extends HttpServlet{@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");String name = req.getParameter("name");String password = req.getParameter("password");System.out.println("name: "+name);System.out.println("password: "+password);String accept = req.getHeader("Accept");System.out.println("Accept: "+accept);}
}
HttpServletResponse对象

用来向前端返回信息

@WebServlet("/web")
public class MethodServlet extends HttpServlet{@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");String name = req.getParameter("name");String password = req.getParameter("password");System.out.println("name: "+name);System.out.println("password: "+password);String accept = req.getHeader("Accept");System.out.println("Accept: "+accept);resp.setContentType("text/html;charset=utf-8");PrintWriter writer = resp.getWriter();if(!"小王".equals(name)){writer.print("<H1>账号不正确<H1>");return;}if(!"123456".equals(password)){writer.print("<H1>密码不正确<H1>");return;}writer.print("<H1>登录成功<H1>");}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STC单片机选择外部晶振烧录程序无法切换回内部晶振导致单片机不能使用

STC单片机选择外部晶振烧录程序无法切换回内部晶振导致单片机不能使用 1.概述 在学习51单片机过程中&#xff0c;选择了STC的12C2052AD型号单片机作为入门芯片。前几个课题实验使用默认的内部晶振烧录程序&#xff0c;运行都没有问题。 选择一个LED亮度渐变的课题做实验&…

Spring-IOC-@Value和@PropertySource用法

1、Book.java PropertySource(value"classpath:配置文件地址") 替代 <context:property-placeholder location"配置文件地址"/> Value("${book.bid}") Value("${book.bname}") Value("${book.price}") <bean id&…

AI原生应用为百度带来新增量

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; AI将彻底改变每一个行业!得益于AI和基础模型的驱动&#xff0c;百度在AI原生应用领域厚积薄发。 11月21日&#xff0c;百度Q3财报发布&#xff0c;数据显示&#xff1a;三季度营收达344.47亿元&…

【Python大数据笔记_day11_Hadoop进阶之MR和YARNZooKeeper】

MR 单词统计流程 已知文件内容: hadoop hive hadoop spark hive flink hive linux hive mysql ​ input结果: k1(行偏移量) v1(每行文本内容)0 hadoop hive hadoop spark hive 30 flink hive linux hive mysql map结果:k2(split切割后的单词) v2(拼接…

MCU 的 TOP 15 图形GUI库:选择最适合你的图形用户界面(一)

在嵌入式系统开发中&#xff0c;选择一个合适的图形用户界面&#xff08;GUI&#xff09;库是至关重要的。在屏幕上显示的时候&#xff0c;使用现成的图形库&#xff0c;这样开发人员就不需要弄清楚底层任务&#xff0c;例如如何绘制像素、线条、形状&#xff0c;如果再高级一点…

CAS方式实现单点登录SSO

1. CAS介绍 CAS&#xff08;Central Authentication Service&#xff09;中心认证服务 下面这张图来自官网&#xff0c;清晰简单的介绍了CAS的继续交互过程 2. CAS具体实现 首先需要分别搭建CAS-server和CAS-client服务&#xff0c; 这两个服务分别在2台机器上&#xff0c;…

数据结构与算法实验(黑龙江大学)

实验一 顺序存储的线性表&#xff08;2 学时&#xff09; 一、实验目的 1 、掌握线性表的逻辑结构特征。 2、熟练掌握线性表的顺序存储结构的描述方法。 3 、熟练掌握顺序表上各种基本操作的实现。 二、实验内容 1 、设线性表的数据元素都为整数&#xff0c;存放在顺序表…

orvibo的Mini网关VS20ZW玩法

概述 闲鱼淘来一个2016年生产的网关,此网关的型号:VS20ZW。 已经不能用APP入网了,没事拆来玩玩。 此设备已经被淘汰,很多新的zigbee产品不再支持入网。 官网设备的简介: ZigBee Mini网关,智能家居网关,智能家居主机|ORVIBO欧瑞博智能网关 设备概貌: 主要器件: …

你了解Postman 变量吗?

变量是在Postman工具中使用的一种特殊功能&#xff0c;用于存储和管理动态数据。它们可以用于在请求的不同部分、环境或集合之间共享和重复使用值。 Postman变量有以下几种类型&#xff1a; 1、环境变量&#xff08;Environment Variables&#xff09;: 环境变量是在Postman…

Java基于B/S架构,包括PC后台管理端、APP移动端、可视化数据大屏的智慧工地源码

智慧工地管理平台充分运用数字化技术&#xff0c;聚焦施工现场岗位一线&#xff0c;依托物联网、互联网、AI等技术&#xff0c;围绕施工现场管理的人、机、料、法、环五大维度&#xff0c;以及施工过程管理的进度、质量、安全三大体系为基础应用&#xff0c;实现全面高效的工程…

Docker基础知识总结

文章目录 1.Docker介绍2.Docker版本3.为什么要使用Docker4.Docker基础组件4.1 镜像&#xff08;Images&#xff09;4.2 容器&#xff08;Container&#xff09;和仓库&#xff08;Repository&#xff09; 5.Docker安装6.Docker run7.Dockerfile8.Docker commit9.镜像发布到镜像…

【20年扬大真题】编写对数组求逆的递归算法

【20年扬大真题】 编写对数组求逆的递归算法 void swap(int* a, int* b) {int tmp *b;*b *a;*a tmp; } void Ni(int arr[],int left,int right) {if (left > right) {return;}swap(&arr[left], &arr[right]);Ni(arr, left 1, right - 1); } int main() {int ar…

Thread的常用方法

一&#xff0c;常用方法 二&#xff0c;案例 父类&#xff1a; package ThreadLianXi;import ThreadLianXi.ZhiLeiA;public class Name {public static void main(String[] args)throws Exception{Thread t1 new ZhiLeiA("1号");//修改名字t1.setName("1号&quo…

csdn最新最全pytest系列——pytest-xdist插件之多进程运行测试用例|| pytest-parallel插件之多线程运行测试用例

pytest之多进程运行测试用例(pytest-xdist) 前言 平常我们功能测试用例非常多时&#xff0c;比如有1千条用例&#xff0c;假设每个用例执行需要1分钟&#xff0c;如果单个测试人员执行需要1000分钟才能跑完当项目非常紧急时&#xff0c;会需要协调多个测试资源来把任务分成两部…

ZYNQ_project:uart(odd,even)

概念&#xff1a; UART&#xff08;Universal Asynchronous Receiver-Transmitter&#xff09;&#xff1a;即通用异步收发器&#xff0c;是一种通用串行数据总线&#xff0c;用于异步通信。一般UART接口常指串口。 UART在发送数据时将并行数据转换成串行数据来传输&#xff…

采用connector-c++ 8.0操作数据库

1.下载最新的Connector https://dev.mysql.com/downloads/connector/cpp/&#xff0c;下载带debug的库。 解压缩到本地&#xff0c;本次使用的是带debug模式的connector库&#xff1a; 注&#xff1a;其中mysqlcppconn与mysqlcppconn8的区别是&#xff1a; 2.在cmakelist…

【2018年数据结构真题】

方法一 给定一个含n(n>1)个整数的数组&#xff0c;请设计一个在时间上尽可能高效的算法&#xff0c;找出数组中未出现的最小正整数。例如&#xff0c;数组{-5&#xff0c;3&#xff0c;2&#xff0c;3}中未出现的最小正整数是1&#xff1b;数组{1&#xff0c;2&#xff0c;…

算法刷题-动态规划2

算法刷题-动态规划2 珠宝的最高价值下降路径最小和 珠宝的最高价值 题目 大佬思路 多开一行使得代码更加的简洁 移动到右侧和下侧 dp[ i ][ j ]有两种情况&#xff1a; 第一种是从上面来的礼物最大价值&#xff1a;dp[ i ][ j ] dp[ i - 1 ][ j ] g[ i ][ j ] 第二种是从左…