【JavaWeb开发-Servlet】day02-使用eclipse实现Servlet开发

news2024/9/22 19:42:42

目录

1、安装IDE-eclipse编译器

2、配置IDE开发环境

(1)使用eclipse关联Tomcat服务器

(2)使用Servlet访问Hello World页面

(3)Java中常用的方法调用方式

(4)Java中常用的反射机制示例


1、安装IDE-eclipse编译器

免安装版本:

优点:占用内存小

缺点:库少,需要自己导

安装版(下载时务必选择Java Web Project):

有点:环境比较完整,库全

缺点:占用内存较大

2、配置IDE开发环境

(1)使用eclipse关联Tomcat服务器

        点击菜单栏window->选择Preferences->在·搜索框中输入Server

->选择Runtime Environments-> 点击Add按钮->

 

 找到对应的服务器版本(下面的复选框先不用选)->点击Next

 ->填好服务器和JDK的环境路径->点击finish

 状态栏显示服务后,点击OK,Tomcat服务器就添加进来了。

 ->点击菜单栏window->选择Show VIew->在other中找到server

 ->选择servers,点击OK

 ->下方的工具栏出现servers选项卡后,点击蓝色链接创建一个新服务对象。

->填好主机名称和服务名->点击下一步 ->再点下一步。

 

 ->双击下方新建的服务器名

 

->选择overview选项卡

 ->在server location里选择第二个选项,用自己下载的Tomcat服务器并添加好路径。->在DeployPath中的路径也改为本地下载的Tomcat中的webapps文件夹。->ctrl+s保存。

 ->右键点击服务器名,选择启动服务器

 ->访问浏览器http://127.0.0.1:8080/

 如下页面,说明服务器启动成功。

 

(2)使用Servlet访问Hello World页面

        新建一个项目,项目类型:Dynamic Web Project

 起个项目名字,点击下一步

 再点下一步

勾选,生成xml部署描述文件,点击finish

 

 可见如下初始项目结构

在src/main/java下新建一个firsttest包

 在包中新建一个Servlet服务,没有的话就在下面other中搜索

 起个类名

 点击下一步,将暂时还用不到的勾选删掉

 点击Finsh。

将代码进一步整理,留下想用的部分

package firsttest;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class testServlet extends HttpServlet {
	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}

}

编写如下代码:

package firsttest;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class testServlet extends HttpServlet {
	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				//设置响应消息头  告诉历览器 我给你的数据是一个用文本格式写的html文件
				response.setContentType("text/html");
				//获取tomcat服务器针对于浏览器的数据输出流
				PrintWriter out=response.getWriter();
				//通过输出流将<h1>Hello World</h1> 由服务器发送给浏览器
				out.println("<h1>Hello World</h1>");
				//关闭流
				out.close();
	}

}

保存后,打开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">
	<servlet>
		<servlet-name>hello</servlet-name>
		<servlet-class>firsttest.testServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>hello</servlet-name>
		<url-pattern>/hello</url-pattern>
	</servlet-mapping>
</web-app>

保存,右键服务器,选择Add and Remove

 将firsttest从左边添加到右边,点击finish

 右键服务名点击运行

 打开浏览器输入网址:http://127.0.0.1:8080/firsttest/hello

 我们的第一个在IDE上运行的Servlet程序就大功告成了。

(3)Java中常用的方法调用方式

a,调用静态方法  可以通过类名直接调用
b,调用非静态方法  通过实例对象调用

创建两个类:

 

 方法类A.class:

package firsttest;

public class A {
	public static void f1() {
		System.out.println("f1静态方法!");
	}
	
	public void f2() {
		System.out.println("f2非静态方法!");
	}
}

方法调用的测试类testA.class:

package firsttest;

public class testA {
	public static void main(String[] args) {
		//调用静态方法:直接调用
		A.f1();
		//调用非静态方法:先创建类对象
		A a = new A();
		a.f2();
	}
}

 运行测试:

 输出:

 

(4)Java中常用的反射机制示例

Java当中的反射机制:Java实现自我管理的一种机制。

反射语法:  
要想实现反射必须获取一个 介质
获取当前类的类对象的方式又三种
Class cls=String.class
Class cls=Class.forName("java.lang.String")
Class cls="abc".getClass();
反射最主要的的意义可以实现代码的解耦

反射示例1:

新建一个反射示例类:

        通过反射函数将字符型参数的类对象的类名、属性和方法名打印输出。

package firsttest;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

public class RelectDemo {

	public static void  main(String[] args) {
		//静态方法直接调用:将String类型变量传给反射函数
		reflect("s");
	}
	
	public static void reflect(Object obj) {
		//通过一个实例类的getClass方法获取当前类的类对象(相当于获取了一个反射介质)
		Class cls = obj.getClass();
		//通过反射机制可以获取当前类的名字
		System.out.println("类:"+cls.getName());
		//获取属性
		Field[] fs=cls.getDeclaredFields();
		System.out.println("属性:");
		for(Field f:fs){
			System.out.println(f.getType()+" "+f.getName());
		}
		//获取方法
		Method[] ms=cls.getDeclaredMethods();
		System.out.println("方法 ");
		for(Method m:ms){
			System.out.print(m.getReturnType()+" ");
			System.out.print(m.getName()+" ");
			System.out.println(Arrays.toString(m.getParameterTypes()));
		}
		//获取构造方法
		Constructor[] cons=cls.getDeclaredConstructors();
		System.out.println("构造方法:");
		for(Constructor c:cons){
			System.out.print(c.getName()+"  ");
			System.out.println(Arrays.toString(c.getParameterTypes()));
		}
	}
}

输出: 

 反射示例2:

        通过反射机制对类解耦。

先来写一个强耦合的例子:

创建以下类:

face、eyes、bigEyes、smallEyes都是普通类,其中bigEyes、smallEyes继承eyes类。 

face:

package firsttest;

public class face {
	public eyes e;
	public face() {
		this.e = new bigEyes();
	}
}

eyes:

package firsttest;

public class eyes {
	
}

smallEyes:

package firsttest;

public class smallEyes extends eyes{
	public String toString() {
		return "this is smallEyes";
	}
}

bigEyes:

package firsttest;

public class bigEyes extends eyes{
	public String toString() {
		return "this is bigEyes";
	}
}

测试类:

package firsttest;

public class test {

	public static void main(String[] args) {
		face face = new face();
		System.out.println(face.e);
	}

}

输出:

 通过在主方法里创建face对象,调用的face函数时输出的eyes只能输出bigEyes。因为在face方法中已经写死了。

此时我们输出的眼睛对象只能输出“大眼睛”,虽然我们可以通过修改代码来控制输出的e的对象,但是不够灵活,耦合度太高了,不能很好的做到自我管理(管理子类对象),需要使用反射机制进行解耦。

反射解耦:

face.class:

package firsttest;

public class face {
	public eyes e;
	public face() throws Exception{
		try {
			//获取当前类的类对象
			Class cls=Class.forName("firsttest.smallEyes");
			//强制类型转换将类对象实例化
			this.e = (eyes)cls.newInstance();
		} catch (ClassNotFoundException e1) {
			e1.printStackTrace();
		}
	}
}

test.class:

package firsttest;

public class test {

	public static void main(String[] args) throws Exception {
		face face = new face();
		System.out.println(face.e);
	}

}

其他类不变,输出:

这一步,通过反射机制,创建了一个smallEyes的反射介质(也就是smallEyes的类对象)通过实例化这个对象,完成输出smallEyes,把这个对象换成BigEyes,就会生成新的的反射对象,从而输出bigEyes。 但是这样还是体现不出反射的好处,下面使用IO流加强程序的改进:

创建一个a.txt文件

 在a.txt中写一个类名

修改face类,使用IO流读取a,txt中的内容: 

face.class

package firsttest;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class face {
	public eyes e;
	public face() throws Exception{
		try {
			FileInputStream in=new FileInputStream("src/main/java/firsttest/a.txt");
			InputStreamReader inr=new InputStreamReader(in);
			BufferedReader r=new BufferedReader(inr);
			//每次读取一行
			String str=r.readLine();
			Class cls=Class.forName(str);
			this.e = (eyes)cls.newInstance();
		} catch (ClassNotFoundException e1) {
			e1.printStackTrace();
		}
	}
}

其他不动,进行测试:

如果将a.txt中的内容改为firsttest.smallEyes

测试输出:

 

 可见,只要将想要反射的类写在a.txt文件中就可以实现不同类的调用了。充分体现了反射的优势,实现代码的解耦。

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

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

相关文章

web3.0学习入门7:深入学习Web3.0

Web3.0背景 2个大事件&#xff1a; 1、2021年10月28日&#xff0c;月活破30亿的Facebook正式官宣改名为Meta&#xff0c;元宇宙和Web3等概念正式从币圈破圈&#xff1b; 2、2021年12月8日&#xff0c;美国众议院加密金融听证会有议员喊出“确保Web3.0革命发生在美国”&#…

数字图像处理实验(二)|图像变换(附实验代码和截图)

文章目录一、实验目的二、主要仪器设备三、实验原理&#xff08;一&#xff09;变换原理1.离散傅里叶变换2.离散余弦变换3.频谱平移&#xff08;二&#xff09;频谱分析原理四、实验步骤和内容1. 为下面三段程序写出注释并上机运行&#xff0c;将实际运行结果如实记录到实验报告…

《数据结构》队列

学习目录队列队列的概念队列的使用(Queue)队列的模拟实现循环队列双端队列&#xff08;Deque&#xff09;面试题队列 队列的概念 队列是一种先进先出&#xff0c;后进后出的特点&#xff0c;是只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表…

selenium使用

selenium使用一 bs4搜索文档树二 css选择器三 selenium基本使用四 无界面浏览器五 selenium其它用法5.1 登录百度5.2 获取位置属性大小&#xff0c;文本5.3 元素操作5.4 执行js代码5.5 切换选项卡5.6 浏览器前进后退5.7 异常处理六 selenium登录cnblogs获取cookie七 抽屉半自动…

kubernetes使用(1.25)

kubernetes使用&#xff08;1.25&#xff09; 内核是AMD、ARM、 $ arch uname -a 注&#xff1a;x86_64,x64,AMD64基本上是同一个东西 K8S 核心概念 Kubernetes有很多核心概念&#xff0c;我们先看下几个核心的概念。其他概念可以看一下我的安装文档 Deployment Deploy…

实现国产化转型,ZStack Cloud 助力中铁财务数字化转型!

中铁财务是中国中铁旗下的金融服务核心企业&#xff0c;随着新业务的快速发展&#xff0c;原有的烟囱式架构使得资源利用率相对较低&#xff0c;难以与其他系统有效协调工作。基于国产化布局的需要&#xff0c;中铁财务选择了 ZStack Cloud 云平台&#xff0c;在充分利旧的基础…

UNIAPP实战项目笔记47 显示默认收货地址和修改收货地址页面的布局

UNIAPP实战项目笔记47 显示默认收货地址和修改收货地址页面的布局 实际案例图片 显示默认地址 修改收货地址后 地址列表 显示默认地址页面 具体内容图片自己替换哈&#xff0c;随便找了个图片的做示例 具体位置见目录结构 完善布局页面和样式 用到了页面间传值 uni.onu…

[附源码]计算机毕业设计JAVA圆梦山区贫困学生助学系统

[附源码]计算机毕业设计JAVA圆梦山区贫困学生助学系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM…

1163. 按字典序排在最后的子串-解题思路推导

1163. 按字典序排在最后的子串-解题思路推导 给你一个字符串 s &#xff0c;找出它的所有子串并按字典序排列&#xff0c;返回排在最后的那个子串。 示例 1&#xff1a; 输入&#xff1a;s “abab” 输出&#xff1a;“bab” 解释&#xff1a;我们可以找出 7 个子串 [“a”…

刷爆力扣之种花问题

刷爆力扣之种花问题 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&#xff0c;每…

YOLOv7 Backbone| 原文源码详解

YOLOv7 Backbone结构详解在之前的文章中&#xff0c;我们以YOLOv5为对象&#xff0c;详细解剖了一只麻雀的内部构造&#xff0c;包括anchor机制、backbone的结构、neck的结构和head的结构。在本篇文章中&#xff0c;我们将以YOLOv7v0.1版本的代码为目标&#xff0c;结合作者团队…

骨骼动画——2D Animation

1、2D骨骼动画 传统的序列帧动画为了达到好的动画效果&#xff0c;理论上来说&#xff0c;图片越多&#xff0c;动作越流畅&#xff0c;往往需要较多的美术资源&#xff0c;虽然效果好但是资源占用较多 而2D骨骼动画是利用3D骨骼动画的制作原理进行制作的&#xff0c;将一张2…

借助 ChatGPT 编写的 libbpf eBPF 工具开发实践教程: 通过例子学习 eBPF

这是一个基于 CO-RE&#xff08;一次编译&#xff0c;到处运行&#xff09;的 libbpf 的 eBPF 的开发教程&#xff0c;提供了从入门到进阶的 eBPF 开发实践指南&#xff0c;包括基本概念、代码实例、实际应用等内容。我们主要提供了一些 eBPF 工具的案例&#xff0c;帮助开发者…

大学免费查题接口

大学免费查题接口 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击跳…

设计模式-day02

4&#xff0c;创建型模式 4.2 工厂模式 4.2.1 概述 需求&#xff1a;设计一个咖啡店点餐系统。 设计一个咖啡类&#xff08;Coffee&#xff09;&#xff0c;并定义其两个子类&#xff08;美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】&#xff09;&#xff1b;再设…

蓝牙学习六(GATT)

1.简介 GATT-Generic Attribute profle-通用属性配置文件。GATT层是传输真正数据所在的层。包括了一个数据传输和存储架构以及其基本操作。GATT用来规范attribute中的数据内容&#xff0c;并运用group&#xff08;分组&#xff09;的概念对attribute进行分类管理。没有GATT&…

查题接口系统

查题接口系统 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点击跳转&#xff09; 题库…

Bootstrap-jqgrid学习(十六)

jqgrid网站地址&#xff1a; jqGrid demos-jqGrid实例-中文-mn886.nethttps://blog.mn886.net/jqGrid/ 表格属性 分页属性&#xff1a; pagerstring定义翻页用的导航栏&#xff0c;必须是有效的html元素。翻页工具栏可以放置在html页面任意位置 显示总条数 viewrecordsbo…

#分支语句详解

第一章 C语言&#xff1a;分支语句 文章目录第一章 C语言&#xff1a;分支语句前言1、什么是语句&#xff1f;2.分支语句&#xff08;选择结构&#xff09;2.1 if语句2.1.1 悬空else2.1.2 if书写形式的对比2.2 switch语句2.2.1 在switch语句中的 break2.2.2 default子句2.2.3 练…

基于频谱的GCN的数学原理

参考链接&#xff1a;如何理解GCN&#xff1f;知乎回答&#xff1a;从热传导模型到GCN从CNN到GCN的联系与区别——GCN从入门到精&#xff08;fang&#xff09;通&#xff08;qi&#xff09; GCN问题本质 图中的每个结点无时无刻不因为邻居和更远的点的影响&#xff0c;而在改…