Servlet学习笔记

Servlet学习笔记

Servlet:

Servlet是javaweb的三大组件之一,它属于动态资源
作用:处理请求(每个Servlet都是唯一的,它们处理的请求都是不同的)
	接收请求数据
	处理请求
	完成响应
Servlet中的方法大多数不由我们来调用,而是由服务器(tomcat)来调用;并且Servlet的对象也不由我们来创建,有tomcat来创建。
如何让浏览器访问servlet
	1.给Servlet指定一个Servlet路径(让Servlet与一个路径绑定在一起)
	2.浏览器访问Servlet路径
		给Servlet配置路径需要在web.xml中对Servlet进行配置
		web.xml
		<servlet>
			<servlet-name>xxx</servlet-name>
			<servlet-class>xx.xx.xx(类名的文件路径)</servlet-class>
		</servlet>

		<servlet-mapping>
			<servlet-name>xxx<servlet-name>
			<url-pattern>/AServlet</url-pttern>
		<servlet-mapping>
		在浏览器上输入localhost:8080/servlet/AServlet来访问xxx文件,而xxx文件指定的是xx.xx.xx(类名的文件路径)
Servlet生命周期方法
	void init():创建之后立即初始化参数的方法,只会执行一次,它并不是Servlet的创建方法
	void service(ServletRequest request, ServletResponse response):每次处理请求都会被调用
	void destroy():销毁之前立即释放资源的方法,只会执行一次,它并不是Servlet的销毁方法
特性:
	单例:一个类只有一个对象,当然可以存在多个Servlet类
	线程是不安全的,所以他的效率是高的
Servlet类由我们来编写,但是对象由服务器来创建,并且由服务器来调用相应的方法

ServletConfig:(此中的对象均为接口,由java提供,而实现类由tomcat提供)
	一个ServletConfig对象,对应一段web.xml中的Servlet的配置信息
	String getServletName():返回该servlet实例的名称(获得的是<servlet-name>中的内容)
	不存在获取<servlet-class>中的内容的方法,因为这是不安全的。
	ServletContext getServletContext():获取Servlet上下文对象
	String getInitParameter(String name):通过名称获取指定的初始化参数的值
	Enumeration getInitParameterNames():获取所有初始化参数的名称(返回值为迭代器)

GenericServlet:已经完美分装了Servlet的五个主要类+一些其他类,为我们只需要继承该类即可。

HttpServlet:
	void service(ServletRequest,ServletResponse)  -->servlet的生命周期函数
		将两个参数强制转化为Http协议相关的类型
		调用类的service(HttpServletRequest,HttpServletResponse)
	void service(HttpServletRequest,HttpServletResponse)  -->参数已经是Http协议相关的,使用起来就更加方便。
		它会通过request得到当前请求的请求方式,例如:GET或者POST
		根据请求方式再调用doGet()或者doPost()

	void doGet(){...}   -->需重写
	void doPost(){...}  -->需重写

不要在servlet中创建成员,创建局部变量即可
可以创建无状态成员
可以创建只读的有状态的成员

在<servlet>中加上<load-on-startup>非负整数</load-on-startup>  (非负整数表示启动顺序,小数为优) 则servlet将在服务器启动后自动创建,并不再是第一次被访问时创建了。

域对象:用来在多个Servlet中传递数据
	域对象必须要有存数据的功能(域对象内部有一个Map用来存储数据)
	域对象必须要有取数据的功能
	JavaWeb的四大域对象:
		PageContext()
		ServletRequest()
		HttpSession()
		ServletContext()


ServletContext():
	一个项目只有一个ServletContext对象!
	我们可以在N多个Servlet中来获取这个唯一的对象,使用它可以给多个Servlet传递数据!
	这个对象在服务器启动时创建,在服务器关闭时才会销毁。

	获取ServletContext:
		ServletConfig#getServletContext()
		GenericServlet#getServletContext()
		HttpSession#getServletContext()
		ServletContextEvent#getServletContext()
		......
	操作数据的方法:
		void setAttribute(String name,Object value):用来存储一个对象(存储一个域属性)
		Object getAttribute(String name):用来获取ServletContext中的数据
		void removeAttribute(String name):用来移出ServletContext中的域属性
		Enumeration getAttributeName():获取所有域属性的名称

	获取应用初始化参数
		Servlet也可以获取参数,但它是局部的,即一个Servlet只能获取自己的初始化参数,不能获取别人的
		ServletContext可以配置公共的初始化参数,为所有的Servlet而用!
			<context-param>
				<param-name>context-name</param-name>
				<param-value>context-value</param-value>
			</context-param>

	获取资源的相关方法
		getRealPath("/index.jsp")   它所得到的路径是带有盘符的
		getResourceAsStream("/index.jsp")   获取资源对象后,再创建输入流对象
		getResourcePaths("/WEB-INF")   获取当前路径下所有资源的路径

	Servlet访问量的统计
		创建一个int类型的变量,然后保存到ServletContext的域中,这样可以保存所有的Servlet都可以访问到
		1、最初时,ServletContext中没有保存访问量相关的值
		2、当本站被第一次访问时,创建一个变量,设置其值为1,保存到ServletContext中
		3、当以后访问时,就可以从ServletContext中获取这个变量,然后在其基础上+1

		获取ServletContext对象,查看是否存在名为count的属性,如果没有,说明是第一次访问;如果有,说明不是第一次访问
			第一次访问:调用ServletContext的setAttribute传递一个属性,名为count,值为1
			第N次访问:调用ServletContext的getAttribute方法获取原来的访问量count,给访问量加1,在调用ServletContext的setAttribute方法完后设置

	获取类路径下资源
		获取类路径资源,类路径对一个JavaWeb项目而言,就是/WEB-INF/classes和/WEB-INF/lib每个jar包



response:
	状态码:
		200:成功
		302:重定向(需设置Location头(新地址))
		404:客户端错误(访问资源不存在)
		500:服务端错误
	响应头:
		头就是一个键值对,可以存在一个头一个值,也可以存在一个头多个值
		setHeader(String name,String value):适用于设置单值的响应头
		addHeader(String name,String value):适用于设置多值的响应头
		setIntHeader(String name,int value):适用于设置单值的int类型的响应头
		addIntHeader(String name,int value):适用于设置多值的int类型的响应头
		setDateHeader(String name,long value):适用于设置单值的毫秒类型的响应头
		addDateHeader(String name,long value):适用于设置多值的毫秒类型的响应头

		重定向,设置Location头完成重定向
		快捷重定向,sendRedirect(String Location);方法
		定时刷新,设置Refresh头(定时重定向)
		禁用浏览器缓存:Cache-Control、pargma、expires

	响应体:
		通常是html,也可以是图片
		response的两个流:
			ServletOutputStream:用来向客户端发送字节数据(图片)  ServletOutputStream out = response.getOutputStream();
			PrintWrite:用来向客户端发送字符数据!需要设置编码  PrintWriter writer = response.getWriter();
			两个流不能同时使用,否则会报错。

request:
	请求行
	请求头
	空行
	请求体(GET没体)

	请求协议中的数据都可以通过request对象来获取!
	获取常用信息:
		获取客户端IP  案例:封IP  request.getRemoteAddr()
		请求方式  request.getMethod()  可能是POST,也可能是GET
	获取请求头
		String getHeader(String name);适用于单值头
		int getHeader(String name);适用于单值int类型的请求头
		long getDateHeader(String name);适用于单值毫秒类型的请求头
		Enumeration<String> getHeader(String name);适用于多值请求头
		案列:
			通过User-Agent识别用户浏览器类型
			防盗链:如果请求不是通过本站的超链接发出的,发送错误状态码404 Referer请求头,表示请求的来源
	获取请求URL
		http://localhost:8080/servlet/HServletRequest?username=&password=

		String getScheme():获取请求协议    http
		String getServerName():获取服务器名    localhost
		String getServerPort():获取服务器端口    8080
		String getContextPath():获取项目名    /servlet
		String getServletPath():获取Servlet路径    /HServletRequest
		String getQueryString():获取参数部分,即问号后面的部分    username=&password=
		String getRequestURI():获取请求URI,等于不包含项目名+Servlet路径    /servlet/HServletRequest
		String getRequestURL():获取请求URL,等于不包含参数的整个请求路径    http://localhost:8080/servlet/HServletRequest

		获取完整的URL可以使用 String URL = request.getRequestURL()+"?"+request.getQueryString();

	获取请求参数:请求参数由客户端发送给服务器的! 有可能是在请求体中(POST请求),也可能是在URL之后(GET请求)
		String getParameter(String name);:获取指定名称的请求参数值,适用于单值请求参数
		String[] getParameterValues(String name);:获取指定名称的请求参数值,适用于多值请求参数
		Enumeration<String> getParameterNames();:获取所有请求参数名称
		Map<String,String[]> getParameterMap();:获取所有请求参数,期中可以为参数名,value为参数值
		案例:
			超链接参数
			表单数据

	请求转发和请求包含
		RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");  使用request获取RequestDispatcher对象,方法的参数是被转发或包含的Servlet的路径
		请求转发:rd.forward(request,response);
		请求包含:rd.include(request,response);

		有时一个请求需要多个Servlet协作才能完成,所以需要在一个Servlet跳转到另一个Servlet!
			一个请求跨多个Servlet,需要使用转发和包含
			请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(留头不留体)
			请求包含:由多个Servlet共同完成响应体(留头也留体)
			无论是请求转发还是请求包含,都在一个请求范围内使用同一个request和response!

	request域:
		Servlet中三大域对象:request,session,application他们均有如下三个方法
			void setAttribute(String name,Object value);
			Object getAttribute(String name);
			void removeAtttribute(String name);

			同一请求范围内使用request.setAttribute(),request.getAttribute()来传值!
			前一个Servlet调用setAttribute()保存值,后一个Servlet调用getAttribute()得到值

	请求转发和重定向的区别:
		请求转发是一个请求一个响应,而重定向是两次请求两次响应
		请求转发地址栏不变化,而重定向会显示后一个请求的地址
		请求转发只能转发到本项目的其他Servlet,而重定向不仅能重定向到本项目的其他Servlet,还能重定向到其他项目
		请求转发是服务器端行为,秩序给出转发的Servlet路径,而重定向需要给出requestURI,即包含项目名
		请求转发的效率高于重定向,因为是一个请求
			需要地址栏发生变化,必须使用重定向
			需要在下一个Servlet中获取request域中的数据,必须使用转发
在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其中3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程中遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境中安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其中3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程中遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境中安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值