利用Tomcat服务器实现一个简单的web应用

news2025/7/20 13:15:13

2023.10.17

        昨天使用Tomcat服务器实现了一个简单的web应用,但是显示的页面是静态页面,今天来实现一个动态的web应用。


对于一个动态的web应用,一个请求和响应的过程中,有哪些角色参与,角色间有哪些协议?

  • 角色

    • 浏览器软件的开发团队(谷歌浏览器、火狐浏览器、IE浏览器....)

    • WEB Server的开发团队(Tomcat、Jetty、WebLogic、JBOSS、WebSphere....)

    • DB Server的开发团队(Oracle、MySQL.....)

    • webapp的开发团队(WEB应用是我们做为JavaWEB程序员开发的)

  • 协议

    • webapp的开发团队 和 WEB Server的开发团队 之间有一套规范: JavaEE规范,Servlet规范。

      • Servlet规范的作用是什么?

        • WEB Server 和 webapp解耦合。

    • Browser 和 WebServer之间有一套传输协议:HTTP协议。(超文本传输协议。)

    • webapp开发团队 和 DB Server的开发团队之间有一套规范:JDBC规范。

        可以用以下图表示:

 Servlet规范

        遵循Servlet规范的webapp,这个webapp就可以放在不同的WEB服务器中运行。Servlet规范包括:

  • 规范了哪些接口

  • 规范了哪些类

  • 规范了一个web应用中应该有哪些配置文件

  • 规范了一个web应用中配置文件的名字

  • 规范了一个web应用中配置文件存放的路径

  • 规范了一个web应用中配置文件的内容

  • 规范了一个合法有效的web应用它的目录结构应该是怎样的。

开发一个带有Servlet的webapp

开发步骤:

  • 第一步:在webapps目录下新建一个目录,起名crm(这个crm就是webapp的名字)。当然,也可以是其它项目,比如银行项目,可以创建一个目录bank,办公系统可以创建一个oa。

    • 注意:crm就是这个webapp的根

  • 第二步:在webapp的根下新建一个目录:WEB-INF

    • 注意:这个目录的名字是Servlet规范中规定的,必须全部大写,必须一模一样。

  • 第三步:在WEB-INF目录下新建一个目录:classes

    • 注意:这个目录的名字必须是全部小写的classes。这也是Servlet规范中规定的。这个目录下一定存放的是Java程序编译之后的class文件(这里存放的是字节码文件)。

  • 第四步:在WEB-INF目录下新建一个目录:lib

    • 注意:这个目录不是必须的。但如果一个webapp需要第三方的jar包的话,这个jar包要放到这个lib目录下,这个目录的名字也不能随意编写,必须是全部小写的lib。例如java语言连接数据库需要数据库的驱动jar包。那么这个jar包就一定要放到lib目录下。

  • 第五步:在WEB-INF目录下新建一个文件:web.xml

    • 注意:这个文件是必须的,这个文件名必须叫做web.xml。这个文件必须放在这里。一个合法的webapp,web.xml文件是必须的,这个web.xml文件就是一个配置文件,在这个配置文件中描述了请求路径和Servlet类之间的对照关系。

  • 第六步:编写一个Java程序,这个小Java程序也不能随意开发,这个小java程序必须实现Servlet接口。

  • 第七步:编译我们编写的HelloServlet

    • 需要配置环境,我这里是:CLASSPATH=.;E:\tomcat\apache-tomcat-10.0.12\lib\servlet-api.jar

我这里的代码是:

package test;
import jakarta.servlet.Servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.ServletConfig;
import java.io.IOException;


public class HelloServlet implements Servlet{

	
	public void init(ServletConfig config) throws ServletException{
	
	}

	public void service(ServletRequest request,ServletResponse response)
		throws ServletException , IOException{
		System.out.println("My first Servlet,Hello Servlet");
	}

	public void destroy(){
	
	}

	public String getServletInfo(){
		return "";
	}

	public ServletConfig getServletConfig(){
		return null;
	}
}
  • 第八步:将以上编译之后的HelloServlet.class文件拷贝到WEB-INF\classes目录下。

  • 第九步:在web.xml文件中编写配置信息,让“请求路径”和“Servlet类名”关联在一起。

我这里的配置信息是:

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
                      https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
  version="5.0"
  metadata-complete="true">

	<servlet>
		<servlet-name>fdsafdsagfdsafdsa</servlet-name>
		<servlet-class>test.HelloServlet</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>fdsafdsagfdsafdsa</servlet-name>
		<url-pattern>/fdsa/fd/saf/d/sa/fd/sa/fd</url-pattern>
	</servlet-mapping>

</web-app>
  • 第十步:启动Tomcat服务器

  • 第十一步:打开浏览器,在浏览器地址栏上输入一个url,这个URL必须是:

    • http://127.0.0.1:8080/crm/fdsa/fd/saf/d/sa/fd/sa/fd

    • 浏览器上的请求路径必须和web.xml文件中的url-pattern一致。

        打开网址后,浏览器不会显示东西,命令行中会显示如下页面的最后一句话:

在Servlet中连接数据库

        Servlet是Java程序,所以在Servlet中可以编写JDBC代码连接数据库。

        在一个webapp中去连接数据库,需要将驱动jar包放到WEB-INF/lib目录下。                    (com.mysql.cj.jdbc.Driver 这个类就在驱动jar包当中。)

编译StudentServlet.java文件,我的代码如下:

package test;

import jakarta.servlet.Servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.ServletConfig;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;


public class StudentServlet implements Servlet{

	public void init(ServletConfig config) throws ServletException{
	
	}

	public void service(ServletRequest request,ServletResponse response)
		throws ServletException , IOException{

		response.setContentType("text/html");
		PrintWriter out = response.getWriter();

	
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try{
			
			Class.forName("com.mysql.cj.jdbc.Driver");
		
			String url = "jdbc:mysql://localhost:3306/jay";
			String user = "root";
			String password = "wuhuajie";
			conn = DriverManager.getConnection(url,user,password);
		
			String sql = "select id,name from student";
			ps = conn.prepareStatement(sql);
		
			rs = ps.executeQuery();
		
			while(rs.next()){
				String id = rs.getString("id");
				String name = rs.getString("name");
				//System.out.println(id + "," + name);
				out.print(id + "," + name + "<br>");
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
		
			if(rs != null){
				try{
					rs.close();
				}catch(Exception e){
					e.printStackTrace();
				}
			}
			if(ps != null){
				try{
					ps.close();
				}catch(Exception e){
					e.printStackTrace();
				}
			}
			if(conn != null){
				try{
					conn.close();
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}
	}

	public void destroy(){
	
	}

	public String getServletInfo(){
		return "";
	}

	public ServletConfig getServletConfig(){
		return null;
	}
}

修改配置文件web.xml如下:

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
                      https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
  version="5.0"
  metadata-complete="true">

	<servlet>
		<servlet-name>fdsafdsagfdsafdsa</servlet-name>
		<servlet-class>test.HelloServlet</servlet-class>
	</servlet>
	
	<servlet-mapping>
		
		<servlet-name>fdsafdsagfdsafdsa</servlet-name>
		<url-pattern>/fdsa/fd/saf/d/sa/fd/sa/fd</url-pattern>
	</servlet-mapping>


	<servlet>
		<servlet-name>servletJDBC</servlet-name>
		<servlet-class>test.StudentServlet</servlet-class>
	</servlet>
	
	<servlet-mapping>
		
		<servlet-name>servletJDBC</servlet-name>
		<url-pattern>/student/list</url-pattern>
	</servlet-mapping>
</web-app>

 先看一下我数据库的结构:

然后在浏览器中输入如下url:http://localhost:8080/crm/student/list

浏览器会根据查询语句从数据库中查询数据,并动态显示出来:

这样就实现了一个动态的web应用。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决方案-LBS用户位置GEO附近人/店铺

附近人 附近人列表功能mysqlredis GEOthinkphp 附近人列表功能 方案优势缺点Mysql外接正方形逻辑清晰&#xff0c;实现简单&#xff0c;支持多条件筛选效率较低&#xff0c;不适合大数据量&#xff0c;不支持按距离排序MysqlGeohash借助索引有效提高效率&#xff0c;支持多条件…

密码学三 btc 钱包 节点 挖矿 51%攻击 双花攻击

03-BTC-数据结构_哔哩哔哩_bilibili 哈希指针并解释 比特币的每个区块都包含一个区块头和区块体两部分。 在区块头中,有一个字段是用于存储前一个区块的哈希值,我们把这个存储前一个区块哈希值的字段称为“哈希指针”。 这个哈希指针的作用是将本区块指向前一个区块,连接起整…

Library projects cannot set applicationId. applicationId is set to

Library projects cannot set applicationId. applicationId is set to com.xxx.library_cache in default config. 删掉即可

RTSP/Onvif安防视频平台EasyNVR级联至EasyNVS系统不显示通道,是什么原因?

视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入&#xff0c;并能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。 我们在此前的文章中也介绍过关于EasyNVR级联EasyNVS上云网关综合管理平台的内容&#xff…

Kotlin之Hello,World

一、新建Kotlin项目 二、设置Gradle为本地目录 #下载地址 https://gradle.org/releases/ 配置阿里云镜像 allprojects {repositories {mavenLocal()maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" } mavenCentral()}buil…

模型量化笔记--对称量化和非对称量化

1–量化映射 量化映射的通用公式为: r S ( q − Z ) r S(q - Z) rS(q−Z) 其中r表示量化前数据的真实值&#xff0c;S表示缩放因子&#xff0c;q表示量化后的数值&#xff0c;Z表示零点 2–非对称量化 非对称量化需要一个偏移量Z来完成零点的映射&#xff0c;即量化前的零…

Facebook注册失败?速看最新注册指南

我们都知道单个代理地址注册多个社媒账号&#xff0c;基本第二天都会进入到一个风控状态&#xff0c;要申诉或者封号&#xff0c;批量注册需要用不同的地址进行注册&#xff0c;下面是需要准备到的环境和材料以及注册的全流程。 一、环境需求 1、接码平台 这个网络上有非常多…

【QT】界面布局-登陆窗口

记录页面布局-登陆窗口的流程 &#xff08;1&#xff09;继承QWidget &#xff08;2&#xff09;设置标签 &#xff08;3&#xff09;单行文本编辑 &#xff08;4&#xff09;按钮 开始设置布局&#xff0c; 法1&#xff1a;使用Horizontal layout&#xff0c;但是不方便 法2…

WebSocket: 实时通信的新维度

介绍&#xff1a; 在现代Web应用程序中&#xff0c;实时通信对于提供即时更新和交互性至关重要。传统的HTTP协议虽然适合请求-响应模式&#xff0c;但对于需要频繁数据交换的场景并不理想。而WebSocket技术的出现填补了这个空白&#xff0c;为Web开发者们带来了一种高效、实时的…

联邦学习+梯度+梯度剪枝

联邦学习需要参与者在每一次的本地训练后&#xff0c;上传所更新的模型参数并与其他参与者共享&#xff0c;而参数更新中仍有可能包含所有者的敏感信息 解决方案&#xff1a; 加密方法&#xff08;安全多方计算、同态加密&#xff09;通过将明文编码为密文的方式&#xff0c;…

MySql分区介绍和Range案例

MySql分区介绍和Range案例 什么是表分区&#xff1f; 通俗地讲表分区是将一个大表&#xff0c;根据条件分割成若干个小表。mysql5.1开始支持数据表分区。 如&#xff1a;某用户表的记录超过了600万条仓储信息&#xff0c;那么就可以根据入库日期将表分区&#xff0c;也可以根…

爬取某网站计算机类图书

网页链接&#xff1a; https://www.ptpress.com.cn/shopping/search?tagsearch&orderstrhot&leve11-75424c57-6dd7-4d1f-b6b9-8e95773c0593 一、为了完成爬取数据&#xff0c;需要进行以下步骤 1.在浏览器中打开页面&#xff0c;选择"计算机" 2.可以看到…

2023年淘宝天猫京东双11红包领取口令入口怎么领取使用淘宝天猫京东双十一红包?

2023年淘宝/天猫、京东双十一红包领取活动即将开始&#xff01; 使用下面提供的淘宝/天猫、京东双11红包口令可以领取淘宝天猫、京东2023年双十一红包&#xff1b; 一、2023年淘宝/天猫双11红包活动时间与规则 1.1、淘宝/天猫双11红包领取时间 2023年10月24日20:00开始至11月…

Numpy(三)Numpy的函数与排序

Numpy&#xff08;三&#xff09;Numpy的函数与排序 一、通用函数 *通用函数使得Numpy数组操作用于数组中的每一个函数。它通常用C语言实现&#xff0c;可以提升执行效率。 1.1数学运算函数 1.1.1算数运算函数&#xff1a;通常使用的加、减、乘、除、乘方等数学运算符号 ①…

HCIA --- VLAN实验配置

一、各交换机上配置&#xff1a; 1、各交换机上创建VLAN 2、交换机上的各个接口划分到对应的VLAN中 3、将与交换机、路由器相连的接口创建trunk干道 SW1&#xff1a; [sw1]vlan batch 2 to 3 批量创建VLAN2-3 [sw1]interface Ethernet0/0/1 单独将某个接口划分到对应…

【Release】Photoshop ICO file format plug-in 3.0

【Introduction】 The Photoshop ICO plug-in is a file format plug-in developed for Photoshop, which allows Photoshop to directly read and write ICO format files. Because Photoshop has powerful pixel bitmap editing functions, it has many users and a good us…

Kotlin注释

一、设置注释样式 按需配置 二、单行多行注释 fun main() {// 单行注释println("单行注释") //单行注释/** 多行注释* */println("多行注释") }

<el-drawer>中在添加弹窗,遮罩层被覆盖

添加这个属性 <el-dialog :append-to-body"true"> </el-dialog>

nginx.2——优化和防盗链

1、隐藏版本号 bug多。更新版本速度比较快&#xff0c;所以一旦版本号暴露出去&#xff0c;有可能给对方提供攻击的漏洞。 方法一 vim /usr/local/nginx/conf/nginx.conf 开server_tokens on; 关server_tokens off; 在http大模块中修改&#xff0c;不再server中&#xf…

腾讯云最新优惠活动入口整理分享

腾讯云作为国内知名的云计算服务提供商&#xff0c;一直以来都为广大的个人用户和企业用户提供优质、稳定、安全的云服务。为了帮助大家更好地利用腾讯云&#xff0c;下面为大家整理分享一些腾讯云的最新优惠活动入口&#xff0c;希望能够为大家带来一些帮助和便利。 一、腾讯云…