当前位置: 首页 > 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;具体可…...

不止于起飞降落:用ROS话题和MAVROS深度操控你的PX4仿真无人机

不止于起飞降落&#xff1a;用ROS话题和MAVROS深度操控PX4仿真无人机 当你第一次看到Gazebo里的无人机成功起飞时&#xff0c;那种成就感就像看着自己组装的航模冲上蓝天。但很快你会发现&#xff0c;反复输入commander takeoff和commander land就像只会用开关控制电灯——我们…...

用Python+Playwright打造你的BOSS直聘求职外挂:从接口分析到自动回复的保姆级教程

PythonPlaywright实战&#xff1a;BOSS直聘自动化求职系统开发指南 求职季最耗时的环节莫过于重复投递简历和机械回复消息。作为开发者&#xff0c;我们完全可以用技术手段优化这一过程。本文将带你从零构建一个基于Playwright的自动化求职系统&#xff0c;涵盖接口逆向、消息…...

别再只盯着Network面板了!用Python 3分钟自动解析Chrome导出的.har文件,提取关键请求数据

3分钟用Python自动化解析.har文件&#xff1a;告别低效手动分析 每次面对几十个.har文件时&#xff0c;你是否还在逐个点击Network面板查看请求&#xff1f;作为开发者&#xff0c;我们经常需要分析接口性能、监控错误请求或统计API调用情况。手动处理这些数据不仅耗时&#xf…...

别再手动点保存了!用C# NXOpen二次开发,一键搞定NX模型批量打开与另存

用C# NXOpen实现NX模型批量处理的工业级解决方案 每天重复点击"文件→打开→检查→另存为"的操作&#xff0c;是不是已经让你手指发麻&#xff1f;在汽车零部件行业工作的张工最近就遇到了这样的困扰——公司要求将3000多个NX模型从旧版本升级到NX 1980系列&#xff…...

专业领域嵌入模型微调与高效数据清洗实践

1. 项目概述&#xff1a;定制化嵌入模型提升专业领域检索效果 在构建专业领域的信息检索系统时&#xff0c;通用嵌入模型的表现往往不尽如人意。以法律文书、医疗记录或多轮客户对话这类专业数据为例&#xff0c;标准模型难以捕捉其中的专业术语、上下文关联和领域特定语义。Co…...

第二十一篇技术笔记:郭大侠学DoIP——4S店郎中的“秘密武器”

写在开篇&#xff1a;丢失的武侠梦&#xff0c;在这里起航和延续&#xff0c;用科技向老爷子的经典致敬。话说郭靖在江湖上混了几年&#xff0c;立了不少功&#xff0c;家底也越来越厚实。黄蓉早就不想坐那台快十年的老马车了——颠得慌不说&#xff0c;还没有空调。更气人的是…...

OpenJK性能优化揭秘:为什么你的绝地学院运行更流畅了

OpenJK性能优化揭秘&#xff1a;为什么你的绝地学院运行更流畅了 【免费下载链接】OpenJK Community effort to maintain and improve Jedi Academy (SP & MP) Jedi Outcast (SP only) released by Raven Software 项目地址: https://gitcode.com/gh_mirrors/op/OpenJK …...

上午题_计算机系统

一.CPU真题二.运算器真题解析&#xff1a;三.控制器真题解析&#xff1a;解析&#xff1a;说白了就两点&#xff1a;指令由操作码、地址码组成指令存在指令寄存器故操作码和地址码也存入指令寄存器。故本题选C.解析&#xff1a;PC(程序计数器)是用于存放下一条指令所在单元的地…...

机器学习中随机化的核心价值与实践指南

1. 随机化在机器学习中的核心价值在真实世界的数据分析中&#xff0c;混杂变量就像房间里的大象——明明对结果有重大影响&#xff0c;却常常被研究者忽视。我处理过的一个电商用户行为预测项目就曾因此吃过大亏&#xff1a;当我们发现"用户点击率"与"购买转化率…...

【无人艇】基于matlab自适应多目标优化的UUV全覆盖路径规划【含Matlab源码 15379期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…...