JSP+Servlet 重要知识点 (含面试题)

JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。

这里提一句:
jsp已经没有深入学习的必要了,除了维护老项目能用上一些,基本属于被淘汰的边缘了。Servlet还是有必要学习一下,比如spring mvc ,structs2等大部分java web框架都是基于Servlet体系来构建的。Servlet Api是这些上层框架的基石。

目录

  • JSP与Servlet 知识点
  • 面试题

JSP与Servlet 知识点

IDEA 配置Tomcat ,详情见之前的文章
JSP:(java server pages)服务器端脚本,由html和嵌入式java组成。简单易用,完全面对对象。
Java Servlet是服务器端技术,通过提供对动态响应和数据持久性的支持来扩展Web服务器的功能。

首先客户端向web服务器提出请求,然后JSP负责将页面转化为Servlet,Servlet经过虚拟机编译成类文件,再把类文件加载到内存中执行,最后由服务器将处理结果返回给客户端。

Tomcat 目录结构
在这里插入图片描述

<%-- 注释内容 --%> 
<%!// 写java 代码int x,y=60;String name = "Joah";int chengji(int m,int n) {return m*n;}%> # 在JSP页面生成Servlet 引入需要包含的页文件,可以是html文件或者JSP文件。在编译时导入
<%@ include file="url"%># param:转发请求到另一个页面,请求过程中会连同请求的参数数据一起被转发到目标页面中。
<jsp:forward page="rel url" />
page="<%=url %>"
<jsp:param name="参数名称" value="李四"/>main.jsp:<jsp:include page="sub.jsp"><jsp:param value="Joan" name="username"/>
</jsp:include>sub.jsp:
<%String username = request.getParameter("username")%><td>用户名: <%=uername%></td>

请求参数(重要)
在这里插入图片描述浏览器地址栏输入 ?name=jacin&city=shanghai

<%String name = request.getParameter("name");String city = request.getParameter("city");if(name != null && city != null) {
%>
<p> Welcome <%=name%>,你的城市是<%=city%></p>
<%}else {
%>

在form中,两个重要的属性:action (提交的页面)和method (post)。
表单写法:
注意 submit 的提交,

 <form  action="index.jsp" method="post"><table align="center"><tr><td>姓名</td><td><input type="text" name="name" value="" /></td></tr><tr><td>城市</td><td><input type="text" name="city" value="" /></td></tr><tr><td><input type="submit" value="提交" /></td></tr><tr><td><input  type="reset" value="重置"/></td></tr></table></form># 在取得参数后,通过转码方式转为合适的字符集
String name = new String(request.getParameter("name").getBytes("ISO-8859-1")
#设置页面重定向
重定向指一个页面在收到一个访问请求后,根据请求的url重新跳转到其他页面。<%response.sendRedirect("sendPage.jsp")
%>

web应用中,Servlet是一个重要的技术,其利用Java类编写的服务端程序,与架构、协议无关。JSP实质就是Servlet,因为JSP页面传回服务端都转为Servlet 进行编译,运行。由于JSP 编写HTML直观,所以也在逐步取代Servlet。

Servlet 生命周期
有3个阶段,分别是init ,service ,destroy
init (初始化):分为装载和初始化。装载一个Servlet 类到Java内存。调用Init方法,只调用一次。
运行阶段:响应客户端的请求,有请求创建HttpServletRequest (/Response),调用service 方法。
消亡阶段,调用destroy,释放所占的资源。例如关闭流,关闭连接等。

这是HelloServlet 的一个例子:

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;# 注解写法,这样子可以不用web.xml
//@WebServlet(
//        urlPatterns = {"/HelloServlet"}, 
//        name = " helloServlet"
//)
public class HelloServlet extends HttpServlet {private  static  final long serialVersionUID = 1L;@Overridepublic void init() throws ServletException{System.out.println("初始化 init 方法"); }@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {super.service(req, res);System.out.println("调用service 方法");res.setContentType("text/html;charset=gbk");PrintWriter out = res.getWriter();out.println("收到service请求");}@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {System.out.println("调用doGet方法");response.setContentType("text/html;charset=gbk");PrintWriter out = response.getWriter();out.println("收到doGet请求");}@Overridepublic void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {System.out.println("调用doPost方法");response.setContentType("text/html;charset=gbk");PrintWriter out = response.getWriter();out.println("收到doPost请求");}
// 法二:编写前进页面:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String userName = request.getParameter("username");String passwd = request.getParameter("passwd");if(checkLogin(userName,passwd)) {request.getRequestDispatcher("/member.htm").forward(request,response);}else {// 返回页面response.sendRedirect("login.jsp");}}// @Overridepublic void destroy() {System.out.println("destroy");}
}

如果不使用注解,也可以使用web.xml配置:

   <servlet><servlet-name>HelloServlet</servlet-name><servlet-class>HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/HelloServlet</url-pattern></servlet-mapping>

最后只要在网站中 加入/HelloServlet 即可运行。
Web容器显示:
在这里插入图片描述
监听器:
监视行为。监听事件来监听请求中的行为而创建的一组类。实现相应的监听接口。触发监听事件,应用服务器会自动调用监听方法。

<listener><listener-class>MyServletContextListener</listener-class>
</listener>// 或者利用注入的方式注入监听类
@WebListener
@WebListener
//ServletContextListener:生命周期监听器,用来监听web初始化或者结束时响应的动作事件。
public class MyServletContextListener implements ServletContextListener {Logger log =Logger.getLogger("MyServletContextListener");@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {//获得对象ServletContext context = servletContextEvent.getServletContext();String name = context.getInitParameter("username");System.out.println(name+"实现接口");log.debug("初始化name"+name);log.debug("Tomcat启动中"); //使用的是log4j 1.2 jar}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {log.debug("Tomcat关闭");}
}

过滤器
作用是阻挡某些事情的发生。在服务器端与客户端起到了一个中间组件的作用,对二者之间的数据进行过滤
在Servlet实现过滤器,必须实现Filter接口,并用注入的方式或者在web.xml定义过滤器

//注入方式
@WebFilter(filterName = "myfilter",servletNames = {"*.do"},urlPatterns = {"/*"},initParams = {@WebInitParam(name = "param" , value = "paramvalue")},dispatcherTypes = {DispatcherType.REQUEST}
)#web.xml 配置:
<filter><description>demo</description><filter-name>myfilter</filter-name><filter-class>Myfilter</filter-class><init-param><param-name>param</param-name><param-value>paramvalue</param-value></init-param>
</filter><!--过滤器映射配置-->
<filter-mapping><filter-name>myfilter</filter-name><servlet-name>*.do</servlet-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher>
</filter-mapping>

DAO 设计模式,降低耦合度,易于理解,也是非常容易入门的设计模式。(常见的JSP 设计模式)
JSP 使用Bean :
在JSP页面中使用Bean:1.规范定义Bean,给出get 和set 2.在页面中导入Bean类。 3.利用jsp:useBean使用Bean类
规范定义Bean类:新增一个类就可以。一种将Bean的class文件部署在Web服务器公共目录中;另一种将Class文件部署在特定目录,Web-INF\classess
在JSP页面中导入相应的Bean类:
在src中定义类

<jsp:useBean id="product" class ="BeanTest.Product" scope="page"/>
scope表示在当前页有效
引入数据
<%=id.getName()%>

客户层—显示层—业务层—数据层—数据库
客户层:客户端浏览器
显示层:利用JSP和Servlet进行页面显示
业务层:对数据层原子性DAO操作进行整合
数据层:数据增删改查
数据库:保存数据库信息
DAO:Data Access Object。主要是对数据进行操作,对于上面层级就是数据层。在数据操作中,主要以面向接口编程为主。一般DAO分为:
VO(Value Object),DatabaseConnection,DAO-implements,DAOImpl,DAOproxy,DAOFactory
DAO命名规则:XxxDAO.

面试题

1.什么是JSP?它与Servlet有何不同?

JSP是JavaServer Pages的缩写,是一种用于构建动态Web页面的Java技术。
与Servlet不同,JSP允许将HTML代码与Java代码混合在同一文件中,使页面开发更容易和更具可读性。

2.JSP的生命周期是什么样的?

1.编译
JSP文件在第一次访问时会被编译成Servlet。编译的过程包括三个步骤:解析JSP文件。将JSP文件转为servlet。编译servlet。
2.初始化
容器载入JSP文件后,它会在为请求提供任何服务前调用jspInit()方法,也就是Servlet实例化并初始化。
如果你需要执行自定义的JSP初始化任务,复写jspInit()方法就行了。
3.JSP执行
当JSP网页完成初始化后,JSP引擎将会调用jspService()方法,处理客户端请求。jspService()方法:需要一个HttpServletRequest对象和一个HttpServletResponse对象作为它的参数 。jspService()方法:在每个request中被调用一次并且负责产生与之相对应的response,并且它还负责产生所有7个HTTP方法的回应,比如GET、POST、DELETE等等。
4.销毁
在Servlet容器关闭或JSP文件被修改时销毁。当你需要执行任何清理工作时复写jspDestroy()方法,比如:释放数据库连接或者关闭文件夹等等。

3.JSP的处理过程?

主要包含以下过程:
就像其他普通的网页一样,首先浏览器发送一个 HTTP 请求给服务器。
Web 服务器识别出这是一个对 JSP 网页的请求,并且将该请求传递给 JSP 引擎,通过使用 URL或者 .jsp 文件来完成。
JSP 引擎从磁盘中载入 JSP 文件,然后将它们转化为 Servlet。
JSP 引擎将 Servlet 编译成可执行类,并且将原始请求传递给 Servlet 引擎。
Web 服务器的某组件将会调用 Servlet 引擎,然后载入并执行 Servlet 类。
在执行过程中,Servlet 产生 HTML 格式的输出并将其内嵌于 HTTP response 中上交给 Web 服务器。
Web 服务器以静态 HTML 网页的形式,将 HTTP response 返回到您的浏览器中。
最终,Web 浏览器处理 HTTP response 中动态产生的HTML网页,就好像在处理静态网页一样。

4.jsp有哪些内置对象作用分别是什么

JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应):
request 用户端请求,此请求会包含来自GET/POST请求的参数
response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application servlet 正在执行的内容
out 用来传送回应的输出
config servlet的构架部件
page JSP网页本身
exception 针对错误网页,未捕捉的例外

  1. jsp有哪些动作作用分别是什么

JSP共有以下6种基本动作
jsp:include:在页面被请求的时候引入一个文件。
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记

6.JSP 和 Servlet 有哪些相同点和不同点,他们之间的联系是什么?

JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,**Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。**而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑

7.静态导入与动态导入区别?

静态包含在翻译的时候,将多个JSP合并翻译成了一个Servlert,动态包含在翻译的时候,每个JSP文件都翻译成了对应Servlet,在程序运行加载到JVM中的时候动态合并,动态包含可以传递参数。

<%@include file="validate.jsp" %>
将被导入页面和导入页面,合在一起进行翻译,编译。最后产生一个Servlet,那么两个页面的变量名不能重复。<jsp:include page="validate.jsp"></jsp:include>
动态导入,被导入页面和导入页面分别翻译,编译,产生两个Servlet,所以两个页面的变量名可以重复.都会被执行。

8.JSP四种作用域

四种作用域包括page、request、session和application,具体来说:

page代表与一个页面相关的对象和属性。
request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。
session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。
application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。

9.<%…%>和<%!…%>的区别

<%…%>用于在JSP页面中嵌入Java脚本

<%!…%>用于在JSP页面中申明变量或方法,可以在该页面中的<%…%>脚本中调用,声明的变量相当于Servlet中的定义的成员变量。

10.servlet的生命周期

当服务器启动的时候生命周期开始,然后通过init(),方法初始化servlet,再根据不同请求调用doGet或doPost方法,最后再通过destroy()方法进行销毁。

11.get和post的区别

在页面提交数据时,get的数据大小有限制4k,post没有限制,get请求提交的数据会在地址栏显示,post不显示,所以post比get安全。

12.404和500是什么意思

404 :找不到url请求的路径,一般是工程名不对或者拼写错误,500 :服务器内部错误,一般是服务器内部代码编写错误,也有可能是抛异常导致。

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

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

相关文章

【本科生通信原理】【实验报告】【北京航空航天大学】实验四:模拟信号的数字化及编码

目录 一、实验目的二、实验内容三、实验程序四、实验结果五、实验分析六、参考文献 一、实验目的 1、掌握低通信号的抽样及重建过程&#xff1b; 2、掌握PCM的编码及译码过程。 二、实验内容 共2问&#xff1a; 三、实验程序 1、 function q1() dt 0.001; % 时间分辨率…

如何本地搭建DolphinScheduler并无公网ip远程访问管理界面

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

通过cpolar在公网访问本地网站

通过cpolar可以轻松将本地网址映射到公网进行访问&#xff0c;下面简要介绍一下实现步骤。 目录 一、cpolar下载 二、安装 三、使用 3.1 登录 3.2 创建隧道 一、cpolar下载 cpolar官网地址&#xff1a;cpolar - secure introspectable tunnels to localhost 通过QQ邮箱…

网络请求 - 异步编程详解

一、概述 网络管理模块主要提供以下功能&#xff1a; HTTP数据请求&#xff1a;通过HTTP发起一个数据请求。WebSocket连接&#xff1a;使用WebSocket建立服务器与客户端的双向连接。Socket连接&#xff1a;通过Socket进行数据传输。 HTTP和WebSocket都是啥&#xff1f; 比如我…

MyBatis - 批量更新(update foreach)报错

在使用mybatis执行批量更新(update foreach)数据的时候报错如下&#xff1a; org.springframework.jdbc.BadSqlGrammarException: ### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; c…

基于web3+solidity的众筹项目

基本配置&#xff1a;node、npm、yarn&#xff0c;安装ganache&#xff0c;chrome&#xff0c;chrome安装插件MetaMask&#xff0c; 主要功能&#xff1a;目的是实现一个简单的众筹平台&#xff0c;允许用户发起筹款项目、捐款、提出使用资金请求以及证明人证明。 部分合约&…

echarts 仪表盘进度条 相关配置

option {series: [{type: gauge,min: 0,//最大值max: 100, //最小值startAngle: 200,//仪表盘起始角度。圆心 正右手侧为0度&#xff0c;正上方为90度&#xff0c;正左手侧为180度。endAngle: -20,//仪表盘结束角度splitNumber: 100, //仪表盘刻度的分割段数itemStyle: {color…

深度学习|4.1 深L层神经网络 4.2 深层网络的正向传播

4.1 深L层神经网络 对于某些问题来说&#xff0c;深层神经网络相对于浅层神经网络解决该问题的效果会较好。所以问题就变成了神经网络层数的设置。 其中 n [ i ] n^{[i]} n[i]表示第i层神经节点的个数&#xff0c; w [ l ] w^{[l]} w[l]代表计算第l层所采用的权重系数&#xff…

day07 四数相加Ⅱ 赎金信 三数之和 四数之和

题目1&#xff1a;454 四数相加Ⅱ 题目链接&#xff1a;454 四数相加Ⅱ 题意 4个整数数组nums1&#xff0c; nums2&#xff0c; nums3&#xff0c; nums4的长度均为n&#xff0c;有多少个元组&#xff08;i&#xff0c;j&#xff0c;k&#xff0c;l&#xff09;使得 nums[…

Python如何生成个性二维码

Python-生成个性二维码 一、问题描述 通过调用MyQR模块来实现生成个人所需二维码。 安装&#xff1a; pip install myqr 二、代码实现 1.普通二维码 from MyQR import myqr # 普通二维码 myqr.run(wordshttp://www.csdn.net/mayi0312,save_nameqrcode.png ) 效果图&#…

@JsonFormat与@DateTimeFormat

JsonFormat注解很好的解决了后端传给前端的格式&#xff0c;我们通过使用 JsonFormat可以很好的解决&#xff1a;后台到前台时间格式保持一致的问题 其次&#xff0c;另一个问题是&#xff0c;我们在使用WEB服务的时&#xff0c;可 能会需要用到&#xff0c;传入时间给后台&am…

buuctf-Misc 题目解答分解109-111

109.[CFI-CTF 2018]webLogon capture 流量包分析&#xff0c; wireshark 打开 就这几个数据包&#xff0c;追踪http 进行url 解码 URL网址解码器 - 在线网址解码 得到flag CFI{1ns3cur3_l0g0n} 110.[GKCTF 2021]excel 骚操作 下载 excel 文件 &#xff0c;打开 发现点击其他地…

计算机Java项目|基于Springboot实现患者管理系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 文末获取源码 项目编号&#xff1a;KS-032…

CanFestival结合Android来完成canopen通信

1.准备开发环境 安装Android Studio和NDK后&#xff0c;需要在Android Studio中创建一个新的NDK项目&#xff0c;并且在项目目录下创建一个jni目录来放置NDK代码。 配置CAN总线接口硬件需要根据具体的硬件要求进行&#xff0c;常见的方法包括使用串口或USB连接CAN总线接口&…

PyTorch Tutorial

本文作为博客“Transformer - Attention is all you need 论文阅读”的补充内容&#xff0c;阅读的内容来自于 https://pytorch.org/tutorials/intermediate/char_rnn_classification_tutorial.html#recommended-preparation 建议的准备流程。 Deep Learning with PyTorch: …

网络知识-以太网技术的发展及网络设备

目 录 一、背景介绍 &#xff08;一&#xff09;网络技术的时代 &#xff08;二&#xff09;以太网技术脱颖而出 二、以太网的工作原理 &#xff08;一&#xff09;、载波侦听多路访问&#xff08;CSMA/CD&#xff09; 1、数据发送流程 2、发送过程解析 3、…

WeNet语音识别+Qwen-72B-Chat Bot+Sambert-Hifigan语音合成

WeNet语音识别Qwen-72B-Chat Bot&#x1f47e;Sambert-Hifigan语音合成 简介 利用 WeNet 进行语音识别&#xff0c;使用户能够通过语音输入与系统进行交互。接着&#xff0c;Qwen-72B-Chat Bot作为聊天机器人接收用户的语音输入或文本输入&#xff0c;提供响应并与用户进行对话…

RPC基础知识总结

RPC 是什么? RPC&#xff08;Remote Procedure Call&#xff09; 即远程过程调用&#xff0c;通过名字我们就能看出 RPC 关注的是远程调用而非本地调用。 为什么要 RPC &#xff1f; 因为&#xff0c;两个不同的服务器上的服务提供的方法不在一个内存空间&#xff0c;所以&am…

软件测试/测试开发丨Vuetify框架的使用

介绍 Vuetify 是一个基于 Vue.js 精心打造 UI 组件库&#xff0c;整套 UI 设计为 Material 风格。能够让没有任何设计技能的开发者创造出时尚的 Material 风格界面。 为什么要使用Vuetify框架 所有组件遵从 Material Design 设计规范&#xff0c;UI 体验非常优秀&#xff0c…

zookeeper经典应用场景之分布式锁

1. 什么是分布式锁 在单体的应用开发场景中涉及并发同步的时候&#xff0c;大家往往采用Synchronized&#xff08;同步&#xff09;或者其他同一个JVM内Lock机制来解决多线程间的同步问题。在分布式集群工作的开发场景中&#xff0c;就需要一种更加高级的锁机制来处理跨机器的进…