Servlet

Java Servlet接口及实现类介绍
本文介绍了Servlet,它是一套规范,按此规范写的代码可在Java服务器运行。重点讲解了Servlet接口,涉及Init方法、ServletConfig和ServletContext的使用;还介绍了GenericServlet,它是Servlet的默认实现;以及HttpServlet,是用HTTP协议实现的Servlet基类,主要重写service方法处理请求。

Servlet是Server+Applet的缩写,表示一个服务器应用。
其实就是一套规范,我们按照这套规范写的代码就可以直接在Java的服务器上面运行
为什么可以?因为Java的服务器也是按这规范写的

Servlet接口

既然Servlet是一套规范,那么最重要的当然就是接口了

//javax.servlet.Servlet
public interface Servlet{
	public void init(ServletConfig config) throws ServletException;
	public ServletConfig getServletConfig();
	public void service(ServletRequest req,ServletResponse res) throws ServletException,IOException;
	public String getServletInfo();
	public void destroy();
}

init()在容器启动时被窗口调用(当load-on-startup设置为负数或者不设置时会在Servlet第一
次用到时才被调用),只会调用一次;
getServletConfig()用于获取ServletConfig;
service()用于具体处理一个请求;
getServletInfo方法可以获取一些Servlet相关的信息,如作者、版权等,这个方法需要自己实现,默认返回空字符串
destroy()主要用于在Servlet销毁(一般指关闭服务器)时释放一些资源,也只会调用一次

Init方法被调用时会接收到一个ServletConfig类型的参数,是容器传进去的。
Selvet-Config顾名思义指的是Servlet的配置
我们在web.xml中定义Servlet时通过init-param标签配置的参数就是通过ServletConfig来保存的,比如,定义SpringMVC的Servlet时指定配置文件位置的contextConfigLocation参数就保存在ServletConfig中

<servlet>
	<servlet-name>实例名</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>demo-servlet.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>

Tomcat中Servlet的init方法是在org.apache.catalina.core.StandardWrapper的initServlet
方法中调用的,ServletConfig传入的是StandardWrapper(里面封装着Servlet)自身的门面类StandardWrapperFacade。
其实这个也很容易理解,Servlet是通过xml文件配置的,在解析xml时就会把配置参数给设置进去,这样StandardWrapper本身就包含配置项了,当然,并不是StandardWrapper的所有内容都是Config相关的,所以就用了其门面Facade类

//ServletConfig接口
package javax.servlet;
public interface ServletConfig{
	//获取Servlet的名字,在web.xml中定义的<servlet-name>名字</servlet-name>
	public String getServletName();
	//非常重要
	public ServletContext getServletContext();
	//用于获取<init-param></init-param>配置的参数
	public String getInitParameter(String name);
	//获取所有init-param的名字集合
	public Enumeration<String> getInitParameterNames();
}
getServletContext()非常重要,它的返回值ServletContext代表的是我们应用本身
ServletContext其实就是Tomcat中Context的门面类ApplicationContextFacade
(具体代码参考StandardContext的getServletContext方法)。
既然ServletContext代表应用本身,
那么ServletContext里边设置的参数就可以被当前应用的所有Servlet共享了。

我们做项目的时候都知道参数可以保存在Session中,也可以保存在Application中
而后者很多时候就是保存在了ServletContext中

我们可以这么理解
ServletConfig是Servlet级的,而ServletContext是Context(也就是Application)级的
当然ServletContext的功能要强大很多,并不只是保存一下配置参数

ServletConfig 和ServletContext最见的使用之一是传递初始化参数,我们以spring配置使用的最多的contextConfigLocation参数为例来看一下

<!-- web.xml -->
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>application-context.xml</param-value>
</context-param>
<servlet>
	<servlet-name>DemoServlet</servlet-name>
	<servlet-class>com.excelib.DemoServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>demo-servlet.xml</param-value>
	</init-param>
</servlet>

上面通过context-param配置的contextConfigLocation配置到了ServletContext中,而通过servlet下的init-param配置的contextConfigLocation配置到的ServletConfig中。在Servlet中可以分别通过它们的getInitParameter方法来获取

String contextLocation = getServletConfig().getServletContext()
                              .getInitParameter("contextConfigLocation");
String servletLocation = getServletConfig().getInitParameter("contextConfigLocation");

另外ServletContext中非常常用的用法就是保存Application级的属性,这个可以使用setAttribute来完成,比如
getServletContext().setAttribute(“contextConfigLocation”,“new path”);
这里设置同名的Attribute并不会覆盖initParameter中的参数值,它们是两套数据,互不干扰。ServletConfig不可以设置属性

GenericServlet(通用的Servlet)

GenericServlet是Servlet的默认实现,主要做了三件事
1.实现了ServletConfig接口,我们可以直接调用里面的方法
2.提供了无参的init方法
3.提供了log方法
GenericServlet实现了ServletConfig接口,我们在需要调用ServletConfig中方法的时候可以直接调用,而不再需要先获取ServletConfig了,比如,获取ServletContext的时候可以直接调用getServletContext,而无须调用getServletConfig().getServletContext()了,不过其底层实现其实是在内部调用了,getServletContext的代码如下

//javax.servlet.GenericServlet
public ServletContext getServletContext(){
	//获取到ServletConfig
	ServletConfig sc = getServletConfig();
	if(sc != null){
		//抛出异常
   }
   return sc.getServletContext();
}

GenericServlet是与具体协议无关的

HttpServlet

HttpServlet是用HTTP协议实现的Servlet的基类,写Servlet时直接继承它就可以了,不需要再从头实现Servlet接口,SpringMVC中的DispatcherServlet就是继承的HttpServlet
即然HttpServlet是跟协议相关的,当然主要关心的是如何处理请求了
所以HttpServlet主要重写了service方法。在servic方法中首先将ServletRequest和ServletResponse转换为了HttpServletRequest和HttpServletResponse,然后根据Http请求的类型不同将请求路由到了不同的处理方法,代码如下

//java.servlet.http.HttpServlet
public void service(ServletRequest res , ServletResponse res){
	HttpServletRequest request;
	HttpServletResponse response;
	//如果请求类型不相符,则抛出异常
	if(!(req instanceof HttpServletRequest && res instanceof HttpServletResponse)){
		//抛出异常
	}
	//转换请求的类型
	request = (HttpServletRequest) req;
	response = (HttpServletResponse) res;
	//调用http的处理方法
	service(request,response);
}
protected void service(HttpServletRequest req,HttpServletResponse resp){
	//获取请求类型
	String method  = req.getMethod();
	//将不同的请求类型路由到不同的方法去处理
	if(method.equals(METHOD_GET)){
		long lastModified = getLastModified(req);
		if(lastModified == -1){
			doGet(req,resp);
		} else {
			long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
			if(ifModifiedSince < lastModified){
				maybeSetLastModified(reqp,lastModified);
				doGet(req,resp);
			} else{
				resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
			}
		}
	} else if(method.equals(METHOD_POST)){
		doPost(req,resp);
		//其他方法省略
	}
}

这就是HttpServlet,它主要将不同的请求方式路由到了不同的处理方法,不过SpringMVC中由于处理思路不一样,又将所有请求合并到了统一的一个方法进行处理

标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之一,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 一、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是一种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是一种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单一模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值