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;

    @Override
    public void init() throws ServletException{
        System.out.println("初始化 init 方法"); 
    }

       
    @Override
    public 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请求");
    }

    @Override
    public 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请求");
    }

    @Override
    public 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");
        }
    }


// 
    @Override
    public 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");
    @Override
    public 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
    }

    @Override
    public 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 :服务器内部错误,一般是服务器内部代码编写错误,也有可能是抛异常导致。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java:Stream流

文章目录 1、体验Stream流2、Stream流的常见生成方式3、Stream流中间操作方法4、Stream流终结操作方法5、Stream流的收集操作6、Stream流综合练习6.1 练习16.2 练习26.3 练习3 以下代码使用JDK11编写。 1、体验Stream流 &#xff08;1&#xff09;案例需求 按照下面的要求完成…

如何使用css隐藏掉滚动条

1.解决方案 在滚动元素上再包裹一个父元素&#xff0c;然后&#xff0c;该元素添加如下代码&#xff1a; &#xff08;注&#xff1a;PC端浏览器滚动条为8px&#xff09;使元素偏移原来位置8px&#xff0c;目的就是将滚动条区域移动到父元素边框外面&#xff0c;然后&#xff…

AI教我学编程之AI自刀

AI教我学编程系列学习第二课 — C#变量类型 上节回顾知识梳理C#基本变量类型 对话AI分歧产生本段总结 它说得对吗&#xff1f;我随即发问经典AI自刀他来了 总结 上节回顾 在上一节中我们发现&#xff0c;AI工具似乎还不能达到教学的水平&#xff0c;所以在本节中&#xff0c;…

ORA-600 adg无法查询故障

再续前缘 ORA-600[12406]故障解决-CSDN博客 当你点背的时候&#xff0c;看似一个简单的case&#xff0c;总是会迎来反转 上次改完参数没两天&#xff0c;又出现了报错不同&#xff0c;但是现象相似的情况 这次是 ORA-600 [kksgaGetNoAlloc_Int0] 这次出现故障的范围更大&a…

【Spring Boot 源码学习】SpringApplication 的定制化介绍

Spring Boot 源码学习系列 SpringApplication 的定制化介绍 一、引言二、往期内容三、主要内容1. 基础配置1.1 设置关闭 Banner1.2 设置自定义 Banner 打印对象1.3 设置应用程序主入口类1.4 设置用于创建应用程序上下文的工厂1.5 添加 BootstrapRegistry 初始化器实现1.6 设置或…

Python学习之路——函数进阶

目录 一、函数的多返回值 &#xff08;一&#xff09;如何操作 &#xff08;二&#xff09;代码示例 二、函数的多种传参方式 &#xff08;一&#xff09;位置参数 &#xff08;二&#xff09;关键字参数 &#xff08;三&#xff09;缺省参数 1、定义 2、作用 3、代码示…

Spring之代理模式

1、概念 1.1 介绍 二十三种设计模式中的一种&#xff0c;属于结构型模式。它的作用就是通过提供一个代理类&#xff0c;让我们在调用目标方法的时候&#xff0c;不再是直接对目标方法进行调用&#xff0c;而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中…

互联网分布式应用之SpringCloud

SpringCloud Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. 微服务项目介绍 2. Eure…

C++ goto语句

作用&#xff1a;可以无条件跳转语句&#xff0c;类似计算机组成原理mips指令集中的jump直接跳转指令&#xff08;汇编语言&#xff09;。 语法&#xff1a;goto标记&#xff1b; 解释&#xff1a;如果标记的名称存在&#xff0c;执行到goto语句时&#xff0c;会跳转到标记的…

小游戏实战丨基于PyGame的贪吃蛇小游戏

文章目录 写在前面PyGame贪吃蛇注意事项系列文章写在后面 写在前面 本期内容&#xff1a;基于pygame的贪吃蛇小游戏 下载地址&#xff1a;https://download.csdn.net/download/m0_68111267/88700188 实验环境 python3.11及以上pycharmpygame 安装pygame的命令&#xff1a;…

python实现windows内存看门狗程序(带GUI界面)

python实现windows内存看门狗程序&#xff08;带GUI界面&#xff09; 效果图 1、程序核心 看门狗程序核心&#xff1a; 1、运行特定程序任务进程 2、监控任务管理器上的内存使用率 3、如果超过阈值则关闭该特定程序进程 4、重新开启该特定程序 5、重复过程2持续监控2、程序流…

Spring Boot 基础知识点1 (含面试题1)

Spring Boot 是一款基于 Spring 框架的开源应用程序开发工具&#xff0c;它旨在简化 Spring 应用程序的配置和开发过程。Spring Boot 提供了一种简单的方式来创建可独立运行的、生产级别的应用程序&#xff0c;并在需要时进行部署。Spring Boot 在微服务架构和云计算环境下得到…

thinkphp6实现简单定时任务

thinkphp6实现定时任务 创建定时任务文件定义指令编写Test.php代码运行测试 创建定时任务文件 Test类名根据自己的需要修改 php think make:command Test testcommand文件夹在app目录下没有需要自己创建 运行上面的命令后会在command下 多一个Test.php文件 定义指令 在conf…

PHP代码审计之实战审代码篇2

4. 仔细观察如下代码&#xff0c;思考代码有什么缺陷&#xff0c;可能由此引发什么样的问题&#xff1f; <?php require_once("/home/rconfig/classes/usersession.class.php"); require_once("/home/rconfig/classes/ADLog.class.php"); require_onc…

金和OA C6 SAP_B1Config.aspx 未授权漏洞

产品介绍 金和网络是专业信息化服务商,为城市监管部门提供了互联网监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 漏洞描述 金和OA C6 SAP_B1Config.aspx接口 未授权&#xff0c;攻击者可通过此漏洞获取数据库账户密码等敏…

2024最新前端源码分享(附效果图及在线演示)

分享10款非常有趣的前端特效源码 其中包含css动画特效、js原生特效、svg特效以及小游戏等 下面我会给出特效样式图或演示效果图 但你也可以点击在线预览查看源码的最终展示效果及下载源码资源 粒子文字动画特效 基于canvas实现的粒子文字动画特效 会来回切换设定的文字特效 图…

postman使用方法指南,最全面的教程

Postman使用教程 一、Postman介绍 ​ Postman是一个英语单词&#xff0c;名词&#xff0c;作名词时意为“邮递员&#xff1b;邮差”。 ​ Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,…

【两阶段鲁棒】计及需求响应的多能互补微网两阶段鲁棒优化matlab

目录 1 主要内容 算例模型 目标函数 第一阶段 第二阶段 求解流程图 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《多能互补微网两阶段鲁棒优化调度研究》&#xff0c;在考虑风光不确定集的基础上提出采用计及DR响应的多能互补微网两阶段鲁棒备用调度模…

ShardingSphere-JDBC学习笔记

引言 开源产品的小故事 Sharding-JDBC是2015年开源的&#xff0c;早期的定位就是一个分布式数据库的中间件&#xff0c;而在它之前有一个MyCat的产品。MyCat也是从阿里开源出来的&#xff0c;作为分库分表的代名词火了很长一段时间&#xff0c;而MyCat早年的目标就是想进入ap…

Python的基础练习题之学生管理系统

需求 使用Python基础写一个基于控制台的学生管理平台&#xff0c;里面功能分别是&#xff1a;1.录入学生信息2.查找学生信息3.删除学生信息4.修改学生信息5.排序6.统计学生总人数7.显示所有学生信息&#xff0c;要求数据存储在文件里。 代码 代码资源地址可以直接下载 效果图…