初学Java Web(6)——JSP学习总结

本文介绍了JSP的学习原因,指出Servlet在生成HTML上的不足,强调了责任分离的重要性。JSP的执行原理是将其翻译成Servlet执行,JSP语法包括三大指令、九大内置对象和四大作用域。文章还提到了EL表达式简化数据获取,以及JSTL作为消除JSP中Java代码的工具,包括其核心标签、格式化标签和XML标签的使用。
摘要由CSDN通过智能技术生成

为什么要学习 JSP

Servlet 的短板:

Servlet 的出现,是为了解决动态输出网页的问题。

虽然这样做目的能达到,但是存在一些缺陷:

  • 在 Servlet 输出网页片段非常恶心(可读性差,维护起来也很麻烦)
  • 没有体现责任分离的原则(做自己擅长做的事)
责任分离
  • Servlet 能够很好地组织业务逻辑代码,但是在 Java 源文件中通过字符串拼接的方式生成动态 HTML 内容会导致代码维护困难、可读性差
  • JSP 虽然规避了 Servlet 在生成 HTML 内容方面的劣势,但是在 HTML 中混入大量、复杂的业务逻辑同样也是不可取的
  • 参考:知乎@David
  • 注意:JSP实质上就是一个Servlet
MVC 模式

既然 Servlet 和 JSP 都有各自的优势和短板,那么为什么不结合起来扬长避短呢?答案是肯定的——MVC(Model-View-Controller)模式非常适合解决这一问题。

MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller):

  • Controller——负责转发请求,对请求进行处理
  • View——负责界面显示
  • Model——业务功能编写(例如算法实现)、数据库设计以及数据存取操作实现

在JSP/Servlet开发的软件系统中,这三个部分的描述如下所示:

1.Web浏览器发送HTTP请求到服务端,被Controller(Servlet)获取并进行处理(例如参数解析、请求转发)
2.Controller(Servlet)调用核心业务逻辑——Model部分,获得结果
3.Controller(Servlet)将逻辑处理结果交给View(JSP),动态输出HTML内容
4.动态生成的HTML内容返回到浏览器显示

MVC模式在Web开发中的好处是非常明显,它规避了JSP与Servlet各自的短板,Servlet只负责业务逻辑而不会通过out.append()动态生成HTML代码;JSP中也不会充斥着大量的业务代码。这大大提高了代码的可读性和可维护性。
- 参考:知乎@David


JSP 的执行原理

  • 总结:
    当访问一个 JSP 页面时,该页面请求将会讲给服务器中的 JSP 引擎去处理,它负责解释和执行 JSP 页面,每个 JSP 页面在第一次被访问时,JSP 引擎就会将它翻译成一个继承自 org.apache.jasper.runtime.HttpJspBase类的 Servlet 源程序,接着再编译成 class 类文件,再由 Web 容器像调用普通 Servlet 程序一样的方式来装载和解释执行这个由 JSP 页面翻译成的 Servlet 程序。

详细资料在这里,感兴趣的戳我


JSP 的语法

像这样冗杂繁复的知识点,直接给两个好一点的链接记下就好了:
1.W3Cschool
2.菜鸟教程


JSP 三大指令

  • 特点:
    不向客户端产生任何输出,指令在 JSP 整个文件范围内有效,并且为翻译阶段提供了全局信息
  • 指令的语法格式:
    <%@ 指令名称 属性名=属性值 属性名=属性值%>
——【page指令】——
  • 作用:
    定义 JSP 页面的各种属性
  • 属性:
    1.language:指示JSP页面中使用脚本语言。默认值java,目前只支持java。
    2.extends:指示 JSP 对应的 Servlet 类的父类。不要修改。
    3.*import:导入JSP中的Java脚本使用到的类或包。(如同Java中的import语句)
    JSP 引擎自动导入以下包中的类:
    javax.servlet.*
    javax.servlet.http.*
    javax.servlet.jsp.*
    注意:一个import属性可以导入多个包,用逗号分隔。
    4.*sessioin:指示JSP页面是否创建 HttpSession 对象。默认值是true,创建
    5.*buffer:指示 JSP 用的输出流的缓存大小.默认值是8Kb。
    6.autoFlush:自动刷新输出流的缓存。
    7.isThreadSafe:指示页面是否是线程安全的(过时的)。默认是true。
    true:不安全的。
    false:安全的。指示 JSP 对应的 Servlet 实现 SingleThreadModel 接口。
    8.*errorPage:指示当前页面出错后转向(转发)的页面。
> 配置全局错误提示页面:
> web.xml 文件中添加:
<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/error.jsp</location>
</error-page>
<error-page>
    <error-code>404</error-code>
    <location>/404.jsp</location>
</error-page>

9.*isErrorPage:指示当前页面是否产生 Exception 对象。
10.*contentType:指定当前页面的 MIME 类型。作用与 Servlet 中的response.setContentType() 作用完全一致
11.*pageEncoding:通知引擎读取 JSP 时采用的编码(因为要翻译)
12.*isELIgnored:是否忽略EL表达式。${1+1}。默认值是false。

  • page 指令最简单的使用方式:
<%@ page pageEncoding="UTF-8"%>
——【include】——
  • 作用:
    包含其他的组件
  • 语法:
    <%@include file=""%>
    file 指定要包含的目标组件。路径如果以 “/”(当前应用)就是绝对路径。
  • 原理:
    把目标组件的内容加到源组件中,输出结果。
静态包含和动态包含的区别:
  • 静态包含:
    <%@include file="被包含的页面的路径"%>
    包含的时机:在 JSP 文件被翻译的时候合并在一起
    最终会被翻译成一个 class 文件
  • 动态包含:
    <jsp:include page="被包含页面的路径"></jsp:include>
    包含的时机:运行阶段合并代码
    最终将得到两个 class 文件
  • 总结:在实际开发中,能用静的就别用动的
——【taglib】——
  • 作用:
    引入外部的标签
  • 语法:
    <%@taglib uri="标签名称空间" prefix="前缀"%>
    例如:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

JSP 九大内置对象

内置对象: JSP 中事先创建好的对象,可以直接拿来使用

名称 类型 描述
pageContext PageContext 表示当前的JSP对象
request HttpServletRequest 表示一次请求对象
session HttpSession 表示一次会话对象,session=”true”
application ServletContext

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值