当前位置: 首页 > news >正文

JSP:Servlet

 Servlet处理请求过程

B/S请求响应模型

 Servlet介绍

JSP是Servlet的一个成功应用,其子集。

JSP页面负责前台用户界面,JavaBean负责后台数据处理,一般的Web应用采用JSP+JavaBean就可以设计得很好了。

JSP+Servlet+JavaBean是MVC

Servlet的核心思想:在服务器端创建能响应用户请求的对象,即Servlet对象。

Servlet类:属于javax.servlet.http包中的HttpServlet类的子类。

Servlet 与 JSP 内置对象

获得内置对象的方法

获得 out 对象

JSP 中的 out 对象,一般可以使用 doXXX 方法中的 response 参数获得

默认情况下,out 对象是无法打印中文

解决方法:response.setContentType("text/html;charset=gb2312");

获得 request 和 response 对象

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//将 request 参数当成 request 对象使用

//将 response 参数当成 response 对象使用

获得 application 对象

   ServletContext application = this.get ServletContext();

//将 application 当成 application 对象来使用

配置环境

使用servlet的步骤:

1.配置 servlet-api.jar

2.编码 *.java

3.编译生成字节码文件 *.class

4.部署

5.调用

JDK 内置包中不包含编译servlet源文件需要HttpServlet、HttpServletRequest等类,因此,需要在环境变量中包含 servlet.jar,这个 jar 文件在 TOMCAT 安装目录的 common\lib 文件下,如果没有可以网上下载。

编辑 classpath,加入%CATALINA_HOME%\lib\servlet-api.jar

将servlet.jar文件拷贝到jdk安装目录的jdk\jre\lib\ext中

部署Servlet

Hello.java

package china.dalian;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class Hello extends HttpServlet

{  public void init(ServletConfig config) throws ServletException

     {  super.init(config); 

     }

   public void service (HttpServletRequest request, HttpServletResponse response)  throws IOException

    {  response.setContentType(“text/html;charset=gb2312”);

       PrintWriter out = reponse.getWriter();

       out.println(“<html><body>”);

       out.println(“<h2>欢迎学习servlet</h2>”);

       out.println(“</body></html>”);

    }

将生成的字节码文件如 Hello.class 保存在Tomcat服务器 WEB-INF\classes 目录下对应包名文件中,包名为  pakage china.dalian 在具体的目录为

WEB-INF\classes\china\dalian

在Web根目录下编辑 web.xml 文件,对 Servlet 文件进行配置

servlet 节:如何生成该servlet

servlet-mapping节:如何调用该servlet

Servlet与JSP的区别

       Servlet是使用Java Servlet接口(API)运行在Web应用服务器上Java程序,其功能十分强大,它不但可以处理Http请求中的业务逻辑,而且还可以输出HTML代码来显示指定页面。

       JSP是一种在Servlet规范之上的动态网页技术,在JSP页面之中,同样可以编写业务逻辑处理Http请求,也可以通过HTML代码来编辑页面,在实现功能上,ServletJSP貌似相同,实质存在一定的区别,表现在以下方面:

1、角色不同

2、编程方法不同

3Servlet需要编译后运行

4、速度不同

Servlet技术特点

       Servlet使用Java语言编写,它不仅继承了Java语言中的优点,而且Servlet还对Web的相关应用进行了封装,同时Servlet容器还提供了对应用的相关扩展,无论是在功能、性能、安全等方面都十分优秀,其技术特点表现在以下方面。

1、功能强大

2、可移植

3、性能高效

4、安全性高

5、可扩展

Servlet代码结构

       在Java中,通常所说的Servlet是指HttpServlet对象,在声明一个对象为Servlet时,需要继承HttpServlet类。

        HttpServlet类是Servlet接口的一个实现类,继承此类后,可以重写HttpServlet类中的方法对HTTP请求进行处理。 Servlet 工作原理-生命周期 

Servlet 工作原理-对象模型  Servlet 工作原理

n init 方法

public void init ( ServletConfig config ) throws ServletException

n service 方法

public void service ( HttpServletRequest request HttpServletResponse response ) throw ServletException, IOException

n destroy 方法

public destroy ( )n

init方法

<web-app>

  …

  <servlet> 

      <servlet-name>InitExample</servlet-name>

      <servlet-class>ServletInit</servlet-class>

  <init-param>

        <param-name>login</param-name>

        <param-value>snoopy</param-value>

      </init-param>

    </servlet>

            …

</web-app>

      对于web.xml中定义的param变量,可以通getInitParameter()  方法来获得。具体格式为:

String str = getInitParameter(“xxx”);

n service方法
n destroy 方法
n

     Servlet类可以直接继承这个方法,一般不需要重写。

         

            public destroy()

 共享变量

        Servlet中声明的某些成员变量,会被所有请求该servlet的用户共享。

  servlet共享变量来计算pi的值。

     PI/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 ……

  doGetdoPost方法

        服务器接收到用户请求后,调用service方法检查http的请求类型(如getpost),并在service方法中根据用户的请求方式,对应地调用doGetdoPost方法。

         因此,不必重写service方法,可直接继承service方法,在servlet类中重写doPostdoGet方法达到同样的效果。

 重定向与转发

 重定向

        HttpServletResponse类中通过方法

void sendRedirect(java.lang.String location) 可实现页面的跳转。

      response.sendRedirect (“xxx.jsp”);

注意:该方法跳转后的页面,不能获得之前页面用户提交的数据。

 转发

        RequestDispatcher对象可以把用户对当前的JSP页面或servlet的请求转发给另一个JSP页面或servlet,并且将请求对象和相应对象传递给目标页面。

第一步:得到RequestDispatcher对象:

RequestDispatcher  rd = request.getRequestDispatcher(“xxx.jsp”);

第二步:转发:

    rd.forward( request, response);

转发 vs 重定向

m 默认情况下 , SendRedirect 不会保留请求对象中参数;需要保存请求的相关信息时要用 请求转发
m SendRedirect 会在客户端呈现跳转后的 URL 地址 请求转发 完全是在服务器上进行,浏览器地址栏中的地址保持不变
m 请求转发 不能将请求发到其他的 web 应用上 SendRedirect 可以
使用session

        HttpServletRequest对象可以调用getSession方法获取用户的session对象。该session对象即第四章中的session对象。

格式:

HttpSession session = request.getSession(true);

       可以在servlet中使用session对象及其方法,实现对同一用户的确认。

Servlet API编程常用接口和类

Servlet接口

方    法    说    明
public void init(ServletConfig config)    Servlet实例化后,Servlet容器调用此方法来完成初始化工作
public void service(ServletRequest request,ServletResponse response)    此方法用于处理客户端的请求
public void destroy()    当Servlet对象应该从Servlet容器中移除时,容器调用此方法,以便释放资源
public ServletConfig getServletConfig()    此方法用于获取Servlet对象的配置信息,返回ServletConfig对象
public String getServletInfo()    此方法返回有关Servlet的信息,它是纯文本格式的字符串,如作者、版本等

m 创建一个 servlet ,实现向客户端输出一个字符串

ServletConfig接口

方    法    说    明
public String getInitParameter(String name)    此方法返回String类型名称为name的初始化参数值
public Enumeration getInitParameterNames()    获取所有初始化参数名的枚举集合
public ServletContext getServletContext()    用于获取Servlet上下文对象
public String getServletName()    返回Servlet对象的实例名

HttpServletRequest接口

方    法    说    明
public String getContextPath()    返回请求的上下文路径,此路径以“/”开关
public Cookie[] getCookies()    返回请求中发送的所有cookie对象,返回值为cookie数组
public String getMethod()    返回请求所使用的HTTP类型,如get、post等
public String getQueryString()    返回请求中参数的字符串形式,如请求MyServlet?username=mr,则返回username=mr
public String getRequestURI()    返回主机名到请求参数之间部分的字符串形式
public StringBuffer getRequestURL()    返回请求的URL,此URL中不包含请求的参数。注意此方法返回的数据类型为StringBuffer
public String getServletPath()    返回请求URI中的Servlet路径的字符串,不包含请求中的参数信息
public HttpSession getSession()    返回与请求关联的HttpSession对象

HttpServletResponse接口

方    法    说    明
public void addCookie(Cookie cookie)    向客户端写入cookie信息
public void sendError(int sc)    发送一个错误状态码为sc的错误响应到客户端
public void sendError(int sc, String msg)    发送一个包含错误状态码及错误信息的响应到客户端,参数sc为错误状态码,参数msg为错误信息
public void sendRedirect(String location)    使用客户端重定向到新的URL,参数location为新的地址

HttpServlet类

      GenericServlet类实现了javax.servlet.Servlet接口,为程序的开发提供了方便;但在实际开发过程中,大多数的应用都是使用Servlet处理HTTP协议的请求,并对请求作出响应,所以通过继承GenericServlet类仍然不是很方便。javax.servlet.http.HttpServlet类对GenericServlet类进行了扩展,为HTTP请求的处理提供了灵活的方法。

     public abstract class HttpServlet

  extends GenericServlet implements Serializable

GenericServlet

       Servlet创建

      在编写一个Servlet对象时,必须实现javax.servlet.Servlet接口,但在Servlet接口中包含5个方法,也就是说创建一个Servlet对象要实现这5个方法,这样操作非常不方便。javax.servlet.GenericServlet类简化了此操作,实现了Servlet接口。

       public abstract class GenericServlet

  extends Object

  implements Servlet, ServletConfig,   Serializable        

      Servlet的创建十分简单,主要有两种创建方法。第一种方法为创建一个普通的Java类,使这个类继承HttpServlet类,再通过手动配置web.xml文件注册Servlet对象。此方法操作比较繁琐,在快速开发中通常不被采纳,而是使用第二种方法——直接通过IDE集成开发工具进行创建。

     使用集成开发工具创建Servlet非常方便,下面以Eclipse为例介绍Servlet的创建过程,其他开发工具大同小异。

Servlet配置

       要使Servlet对象正常地运行,需要进行适当的配置,以告知Web容器哪一个请求调用哪一个Servlet对象处理,对Servlet起到一个注册的作用。Servlet的配置包含在web.xml文件中,主要通过以下两步进行设置。

            (1)声明Servlet对象

            2)映射Servlet

m    创建名为 MyServlet 对象,继承了 HTTPServlet 类,重写 doGet()方法
总结概括 Servlet的生命周期
m 1 . 客户端向服务器 发出请求 ,服务器根据客户端的请求,找到相应的 Servlet
m 2. 判断该 Servlet 是否在内存中加载?若未加载,创建该 Servlet 实例,调用 init() 方法完成 初始化操作 若已经加载,转 3
m 3. 调用 service() 方法对客户端进行 响应 。等待下一次请求 Servlet 生命周期中, service() 方法是其中的核心。每当客户端向 Servlet 发出一个请求时,该方法就会被调用 , 对用户的请求进行处理,并返回响应。
m 4. 结束,调用 destroy() 方法 当服务器端不再需要该 Servlet 的时候,服务器调用 destroy() 方法卸载 Servlet ,释放 Servlet 运行时占用的资源。

相关文章:

JSP:Servlet

Servlet处理请求过程 B/S请求响应模型 Servlet介绍 JSP是Servlet的一个成功应用&#xff0c;其子集。 JSP页面负责前台用户界面&#xff0c;JavaBean负责后台数据处理&#xff0c;一般的Web应用采用JSPJavaBean就可以设计得很好了。 JSPServletJavaBean是MVC Servlet的核心…...

react中的state

没想到hooks中也有state这一说法 看下面的两个案例 1、无state变化不会执行父子函数 2、有state更改执行父子函数...

VR全景航拍要注意什么,航拍图片如何处理

引言: VR全景航拍技术是当前摄影和航拍领域的新潮流。它采用虚拟现实技术&#xff0c;通过360度全景镜头捕捉画面&#xff0c;可以为观众提供身临其境的视觉体验。在宣传展示中&#xff0c;利用VR全景航拍技术可以为品牌宣传带来更加生动、震撼的视觉效果。 一、航拍注意事项 …...

Spark---集群搭建

Standalone集群搭建与Spark on Yarn配置 1、Standalone Standalone集群是Spark自带的资源调度框架&#xff0c;支持分布式搭建&#xff0c;这里建议搭建Standalone节点数为3台&#xff0c;1台master节点&#xff0c;2台worker节点&#xff0c;这虚拟机中每台节点的内存至少给…...

Linux上通过SSL/TLS和start tls连接到LDAP服务器

一&#xff0c;大致流程。 1.首先在Linux上搭建一个LDAP服务器 2.在LDAP服务器上安装CA证书&#xff0c;服务器证书&#xff0c;因为SSL/TLS&#xff0c;start tls都属于机密通信&#xff0c;需要客户端和服务器都存在一个相同的证书认证双方的身份。3.安装phpldapadmin工具&am…...

【华为OD题库-034】字符串化繁为简-java

题目 给定一个输入字符串&#xff0c;字符串只可能由英文字母(a ~ z、A ~ Z)和左右小括号()组成。当字符里存在小括号时&#xff0c;小括号是成对的&#xff0c;可以有一个或多个小括号对&#xff0c;小括号对不会嵌套&#xff0c;小括号对内可以包含1个或多个英文字母也可以不…...

斯坦福大学引入FlashFFTConv来优化机器学习中长序列的FFT卷积

斯坦福大学的FlashFFTConv优化了扩展序列的快速傅里叶变换(FFT)卷积。该方法引入Monarch分解&#xff0c;在FLOP和I/O成本之间取得平衡&#xff0c;提高模型质量和效率。并且优于PyTorch和FlashAttention-v2。它可以处理更长的序列&#xff0c;并在人工智能应用程序中打开新的可…...

信息系统项目管理师-干系人管理论文提纲

快速导航 1.信息系统项目管理师-项目整合管理 2.信息系统项目管理师-项目范围管理 3.信息系统项目管理师-项目进度管理 4.信息系统项目管理师-项目成本管理 5.信息系统项目管理师-项目质量管理 6.信息系统项目管理师-项目资源管理 7.信息系统项目管理师-项目沟通管理 8.信息系…...

Windmill:最快的自托管开源工作流引擎

我们对 Windmill 进行了基准测试&#xff0c;认为它是 Airflow、Prefect 甚至 Temporal 中最快的自托管通用工作流引擎。对于 Airflow&#xff0c;有速度快了 10 倍&#xff01; 工作流引擎编排工作人员的有向无环图 (DAG) 中定义的作业&#xff0c;同时尊重依赖性。 主要优点…...

线性代数 - 几何原理

目录 序言向量的定义线性组合、张成空间与向量基线性变换和矩阵线性复合变换与矩阵乘法三维空间的线性变换行列式矩阵的秩和逆矩阵维度变换点乘叉乘基变换特征值和特征向量抽象向量空间 序言 欢迎阅读这篇关于线性代数的文章。在这里&#xff0c;我们将从一个全新的角度去探索线…...

火电厂电气部分设计

摘要 本文首先根据任务书上所给系统与线路及所有负荷的参数&#xff0c;分析负荷发展趋势。从负荷增长方面阐明了建站的必要性&#xff0c;然后通过对拟建变电站的概括以及出线方向来考虑&#xff0c;并通过对负荷资料的分析&#xff0c;安全&#xff0c;经济及可靠性方面考虑…...

界面组件DevExpress Reporting v23.1 - Web报表设计器功能升级

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表 界面组件DevExpress Reporting v23.1已经发布一段…...

小程序Canvas 2D问题解决,如安卓drawImage不执行、动态高度设置、高度1365(或4096)限制等

我的最新版小程序想在绘制时使用自定义字体&#xff0c;需要将旧版canvas升级到2d新版&#xff0c;发现了许多问题&#xff0c;下面记录一下并提供解决思路&#xff0c;仅供参考&#xff0c;欢迎提供新思路。 一、开发工具和安卓上drawImage不执行&#xff0c;绘制出来是空白&…...

人工智能对网络安全的影响越来越大

如果问当前IT行业最热门的话题是什么&#xff0c;很少有人会回答除了人工智能&#xff08;AI&#xff09;之外的任何话题。 在不到 12 个月的时间里&#xff0c;人工智能已经从一项只有 IT 专业人员才能理解的技术发展成为从小学生到作家、程序员和艺术家的每个人都使用的工具…...

JavaEE(SpringMVC)期末复习

文章目录 JavaEE期末复习一、单选题&#xff1a; JavaEE期末复习 一、单选题&#xff1a; 1.Spring的核⼼技术是&#xff08; A &#xff09;&#xff1f; A依赖注入 B.JdbcTmplate C.声明式事务 D.资源访问 Spring的核心技术包括依赖注入&#xff08;Dependency Injection&am…...

微服务保护 Sentinel

1.初识Sentinel 文章目录 1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.超时处理1.1.3.仓壁模式1.1.4.断路器1.1.5.限流1.1.6.总结 1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制2.1.簇点链…...

【无标题】文本超过一行隐藏,鼠标经过显示提示框

创建一个组件专门用来出来文字的 <template><div class"tooltip-wrap"><el-tooltipref"tlp":content"text"effect"dark":disabled"!tooltipFlag":placement"placement"popper-class"tooltip…...

成为独立开发者有多难

首先自我介绍&#xff1a;我是一名前端开发工程师&#xff0c;7年的前端开发经验。CSDN 九段刀客_js,vue,ReactNative-CSDN博客,80多万的访问量&#xff0c;1万多的粉丝。 相信80%的程序员的终极梦想都是成为一名独立开发者&#xff0c;不用找工作有自己的产品可以有睡后收入。…...

C++ 正则表达式使用

C 11 以后有了正则表达式,对于处理字符串还是很方便的.由于我也再学习.所以下面的内容有可能描述的不准确,这些都是我自己代码中使用的,或者demo测试的. 首先使用正则表达式先要添加头文件 #include <regex> 然后编写自己的正则表达式: 例如我想匹配字符串中表示数字…...

VSCode任务tasks.json中的问题匹配器problemMatcher的问题匹配模式ProblemPattern详解

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、简介 在 VS Code 中&#xff0c;tasks.json 文件中的 problemMatcher 字段用于定义如何解析任务输出中的问题&#xff08;错误、警告等&#xff09;。 problemMatcher有三种配置方式&#xff0c;具体可…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

GAN模式奔溃的探讨论文综述(一)

简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...