JavaWeb开发 JSP技术详解(一)

简介: JavaWeb开发 JSP技术详解(一)

一、JSP简介

1.1 JSP介绍

JSP(全称Java Server Pages)Java服务端页面技术,是JavaEE平台下的技术规范。它允许使用特定的标签在HTML网页中插入Java代码,实现动态页面处理,所以JSP就是HTML与Java代码的复合体。JSP技术可以快速的实现一个页面的开发,相比在Servlet中实现页面开发将变得更加容易。

1.2 常见的视图层技术

HTML、JSP、Thymeleaf等。

1.3 前后端分离开发方式

在前后端分离的项目中真正可以做到“术业有专攻”(开发人员分离) 。前后端分离开发方式中前端页面由专业团队完成页面的开发,并通过请求调用后端的api接口进行数据交互。在开发前端页面的团队中更多关注的技术如:html、CSS、jQuery、Vue、Nodejs等前端技术。前端追求的是:页面表现,速度流畅,兼容性,用户体验等等。而后端团队则更多的是业务的具体实现。在后端开发的团队中更多关注的技术如:设计模式、分布式架构、微服务架构、数据库的操作、Java的性能优化以及数据库优化等技术。前后端分离已成为互联网项目开发的业界标准使用方式,特别是为大型分布式架构、弹性计算架构、微服务架构、多端化服务(多种客户端,例如:浏览器,车载终端,安卓,IOS等等)打下坚实的基础。

二、JSP运行原理

2. 1JSP技术特点

JSP和Servlet是本质相同的技术。当一个JSP文件第一次被请求时,JSP引擎会将该JSP编译成一个Servlet,并执行这个Servlet。如果JSP文件被修改了,那么JSP引擎会重新编译这个JSP。

JSP引擎对JSP编译时会生成两个文件分别是.java的源文件以及编译后的.class文件,并放到Tomcat的work目录的Catalina对应的虚拟主机目录中的org\apache\jsp目录中。两个文件的名称会使用JSP的名称加”_jsp”表示。如:index_jsp.java、index_jsp.class

2.2 JSP与Servlet区别

  • JSP以源文件形式部署到容器中。而Servlet需要编译成class文件后部署到容器中。
  • JSP部署到web项目的根目录下或根目录下的其他子目录和静态同资源位于相同位置。而Servlet需要部署到WEB-INF/classes目录中。
  • JSP中的HTML代码会被JSP引擎放入到Servlet的out.write()方法中。而在Servlet中我们需要自己通过对字符流输出流的操作生成响应的页面。
  • JSP更擅长表现于页面显示,Servlet更擅长于逻辑控制。

三、JSP标签的使用

3.1 原始标签

JSP的原始标签在JSP的任何版本中都可以使用。

3.1.1 <%! %> 声明标签

声明标签用于在JSP中定义成员变量与方法的定义。标签中的内容会出现在JSP被编译后的Servlet的class的{}中。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  Hello jsp!
  <%! int a = 10; 
    public void add(int a) {
      System.out.println(a);
    } 
    %>
  </body>
</html>

3.1.2 <% %>脚本标签

脚本标签用于在JSP中编写业务逻辑。标签中的内容会出现在JSP被编译后的Servlet的_jspService方法体中。因此在脚本标签中是不允许再声明方法的,只能定义局部变量、循环判断等。

<%
    int a = 10;
  %>

3.1.3 <%= %>赋值标签

赋值标签用于在JSP中做内容输出。标签中的内容会出现在_jspService方法的out.print()方法的参数中。注意我们在使用赋值标签时不需要在代码中添加 ”;”。

<%= a %>

3.1.4原始标签的使用

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
 <%
    int flag = new Random().nextInt(100);
    String str = "";
    if(flag<=20){
        str = "中奖了";
    }else {
        str = "没中奖";
    }
 %>
<%= str %>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
 <%
    int flag = new Random().nextInt(100);
    String str = "";
    if(flag<=20){ %>
     中奖了
<%} else { %>
    没中将
<%}%>
</body>
</html>

3.2 JSP的指令标签

JSP指令标签的作用是声明JSP页面的一些属性和动作。

<%@指令名称 属性="值" 属性="值1,值2...."%>

3.2.1 JSP指令标签分类

Page指令标签

<%@ page import="java.util.Random" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8"
         session="true" %>

contentType

设置响应类型和编码,默认使用contentType指定的编码方式。

pageEncoding

设置当前页面的编码。

import

导入所需要的包。

language

当前JSP页面里面可以嵌套的语言。

session

设置JSP页面是否获取session内置对象,默认true。

buffer

设置JSP页面的流的缓冲区的大小。

autoFlush

是否自动刷新。

exends

声明当前JSP的页面继承于那个类.必须继承的是httpservlet 及其子类。

isELIgnored

是否忽略el表达式。

errorPage

当前JSP页面出现异常的时候要跳转到的JSP页面。

isErrorPage

当前JSP页面是否是一个错误页面。若值为true,可以使用JSP页面的一个内置对象 exception。

Include指令标签

静态包含,可以将其他页面内容包含进来,一起进行编译运行.生成一个java文件.

<%@include file="被包含JSP的相对路径" %>

Taglib指令标签

导入标签库。

<%@taglib prefix="前缀名" uri="名称空间" %>

四、JSP的内置对象

JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception。注意面试会问。

request对象

request 对象是 HttpServletRequest类型的对象。

response对象

response 对象是 HttpServletResponse类型的对象。

session对象

session 对象是HttpSession类型的对象。只有在包含 session=“true” 的页面中才可以被使用。

application对象

application 对象是ServletContext类型的对象。

out 对象

out 对象是JspWriter类型的对象。

config 对象

config 对象是ServletConfig类型的对象。

pageContext 对象

pageContext 对象是PageContext类型的对象。作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。

page 对象

page 对象代表JSP本身。

exception 对象

exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用。

五、请求转发

什么是请求转发

请求转发是服务端的一种请求方式,相当于在服务端中直接请求某个资源。

RequestDispatcher dispatcher = request.getRequestDispatcher("/test.jsp");
dispatcher.forward(request,response);

简写方式:

request.getRequestDispatcher("/test.jsp").forword(request,response);

请求转发(服务端跳转)与重定向(客户端跳转)的区别

  • 请求转发对于客户端浏览器而言是在一次请求与响应中完成,而重定向是在两次请求两次响应中完成。
  • 请求转发并不会改变客户端浏览器的地址栏中的内容。而重定向会改变客户端浏览器地址栏中的内容。
  • 请求转发可以使用request对象传递数据,而重定向不能使用request对象传递数据。
  • 如果是处理的DML操作(增删改),建议使用重定向方式为客户端浏览器产生响应,可以解决表单重复提交现象。

请求转发案例

需求:在Servlet中获取客户端浏览器所支持的语言,并通过JSP页面将客户端浏览器所支持的语言响应给客户端浏览器。

package cn.it.Servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/language.do")
public class LanguageServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //获取请求头中浏览器支持的语言
        String header = req.getHeader("Accept-Language");
        //将数据存放到request
        req.setAttribute("language",header);
        //响应到客户端
        req.getRequestDispatcher("language.jsp").forward(req, resp);
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<% String language = (String) request.getAttribute("language");%>
<font color="red"> <%= language %> </font>
</body>
</html>

六、JSP四大作用域对象

作用域:“数据共享的范围”,也就是说数据能够在多大的范围内有效。

对象名称 作用范围
application 整个应用都有效
session 在当前会话中有效
request 在当前请求中有效
page 在当前页面有效

七、JSTL标签库

7.1 什么是JSTL标签库

JSTL(Java server pages standard tag library,即JSP标准标签库)JSTL标签是基于JSP页面的。这些标签可以插入在JSP代码中,本质上JSTL也是提前定义好的一组标签,这些标签封装了不同的功能,在页面上调用标签时,就等于调用了封装起来的功能。JSTL的目标是使JSP页面的可读性更强、简化JSP页面的设计、实现了代码复用、提高效率。

在JSP2.0版本后开始支持JSTL标签库。在使用JSTL标签库时需要在JSP中添加对应的taglib指令标签。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

7.2 JSTL标签分类

根据JSTL标签所提供的功能,可以将其分为5个类别。

7.2.1 核心标签

最常用、最重要,也是最基本的标签

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

7.2.2 格式化标签

JSTL格式化标签用来格式化并输出文本、日期、时间、数字。

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

7.2.3 SQL标签

JSTL SQL标签库提供了与关系型数据库(Oracle,MySQL,SQL Server等等)进行交互的标签。

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

7.2.4 XML标签

JSTL XML标签库提供了创建和操作XML文档的标签。

7.2.5 JSTL函数

JSTL包含一系列标准函数,大部分是通用的字符串处理函数。

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

相关文章
|
1月前
|
Java 容器
【学习笔记】Jsp与Servlet技术
【学习笔记】Jsp与Servlet技术
61 0
|
1天前
|
前端开发 Oracle 关系型数据库
关于使用SSM+JSP开发时setter、getter隐式调用问题的小结
本文主要分享了在使用SSM+JSP进行网站开发时,因忽视setter、getter的隐式调用问题而导致的常见bug及其解决方法。详细介绍了setter和getter的隐式调用时机,并给出了具体示例,帮助开发者避免类似问题。
23 11
|
2月前
|
存储 前端开发 Java
JavaWeb基础6——Request,Response,JSP&MVC
Request继承体系、获取请求头行体的方法、IDEA使用模板创建Servlet、请求参数中文乱码解决、请求转发、Respones重定向、Response响应字节字符数据、JSP、EL 表达式、JSTL标签、MVC模式和三层架构
JavaWeb基础6——Request,Response,JSP&MVC
|
3月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
32 3
|
3月前
|
前端开发 安全 Java
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
27 0
|
5月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
【6月更文挑战第23天】Java Web开发中,Servlet和JSP是构建动态Web应用的基础。Servlet处理逻辑,JSP专注展示。示例展示了Servlet如何通过`request.setAttribute`传递数据给JSP渲染。JSP自定义标签提升页面功能,如创建`WelcomeTag`显示欢迎消息。Servlet过滤器,如`CacheControlFilter`,用于预处理数据或调整响应头。这些集成和扩展技术增强了应用效率、安全性和可维护性,是Java服务器端开发的关键。
63 7
|
5月前
|
前端开发 安全 Java
Java服务器端开发实战:利用Servlet和JSP构建动态网站
【6月更文挑战第23天】**Servlet和JSP在Java Web开发中扮演关键角色。Servlet处理业务逻辑,管理会话,JSP则结合HTML生成动态页面。两者协同工作,形成动态网站的核心。通过Servlet的doGet()方法响应请求,JSP利用嵌入式Java代码创建动态内容。实战中,Servlet处理数据后转发给JSP展示,共同构建高效、稳定的网站。虽然新技术涌现,Servlet与JSP仍为Java Web开发的基石,提供灵活且成熟的解决方案。**
71 8
|
5月前
|
搜索推荐 Java 数据库连接
探索Java Web开发:Servlet与JSP的协同工作原理
【6月更文挑战第23天】Java Web开发中,Servlet和JSP协同打造动态网站。Servlet是服务器端的Java程序,处理HTTP请求并执行复杂逻辑;JSP则结合HTML和Java,生成动态内容。Servlet通过`doGet()`等方法响应请求,JSP在首次请求时编译成Servlet。两者常搭配使用,Servlet处理业务,JSP专注展示,通过`RequestDispatcher`转发实现数据渲染。这种组合是Java Web应用的基础,即使新技术涌现,其价值仍然重要,为开发者提供了强大的工具集。
61 7
|
5月前
|
存储 设计模式 搜索推荐
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(下)
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(下)
31 1
|
5月前
|
XML 前端开发 Java
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(上)
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(上)
30 0

相关实验场景

更多