1、什么是jsp,为什么要使用jsp。

  再使用idea创建完一个web工程后,在webapp目录下会生成一个index.jsp

  直接编译运行,网站将自动打开这样一个网页:

  所以我们可以推测这个index.jsp就是决定这个项目的初始页面的HTML编码的,这里的hello-world是部署Tomcat时设置的。

  所以其实JSP就是用来编写HTML编码的一种解决方案,那为什么需要额外的这样一套解决方案呢?

  这是我之前对Servlet简单的使用:

        PrintWriter writer = resp.getWriter();
writer.append("<!DOCTYPE html>\r\n")
.append("<html >\r\n")
.append(" <head>\r\n")
.append(" <title>hello user application</title>\r\n")
.append(" </head>\r\n")
.append(" <body>\r\n")
.append(" Hello, ").append(user).append("!<br/><br/>\r\n")
.append(" <form action=\"first\" method=\"POST\">")
.append(" Enter your name:<br/>\r\n")
.append(" <input type=\"text\" name=\"user\"/><br/>\r\n")
.append(" <input type=\"submit\" value=\"Submit\"/>\r\n")
.append(" </form>\r\n")
.append(" </body>\r\n")
.append("</html>\r\n");

  这是在像response添加正文,用于HTML的编码,可以发现这里HTML和Java结合得并不好,导致代码很长还很乱,特别是引号需要转义符。所以其实我们应该把这一块HTML编码独立出去,所以就有了这样一套名为JSP(JavaServerPages)的混合解决方案,它结合了Java代码和HTML标签,JSP包括了所有的HTML标签,以及内建的JSP标签、自定义的JSP标签以及表达式语言。

2、JSP在运行时的处理

  • 其实JSP只是一个精心设计的Servlet,JSP只是一种语法糖,在运行的时候JSP代码将由JSP编译器进行转换,它将解析出JSP代码的特性并把它们转换成Java代码,由JSO创建得到的Java类都将实现Servlet,最后和其他Servlet一样对请求做出响应。
  • JSP和其他Servlet一样有自己的生命周期,不同的Web容器不一样,比如在Tomcat中JSP将在第一次请求到达之前被即时的转换并编译,对于之后的请求可以之间使用编译好的JSP。而许多其他的容器则提供了在部署应用程序时预编译所有的JSP选项。

3、JSP指令

  JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。

  • <%@ page ... %>提供了对JSP如何进行转换、渲染和传输到客户端的控制
<%@ page language="java" contentType="text/html; charset=UTF-8"%>

  其中language将告诉容器JSP使用的是那种脚本语言,contentType和charset将设置JSP页面的MIME类型和字符编码,

  page指令相关的属性:

buffer 指定out对象使用缓冲区的大小
autoFlush 控制out对象的 缓存区
contentType 指定当前JSP页面的MIME类型和字符编码
errorPage 指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage 指定当前页面是否可以作为另一个JSP页面的错误处理页面
extends 指定servlet从哪一个类继承
import 导入要使用的Java类
info 定义JSP页面的描述信息
isThreadSafe 指定对JSP页面的访问是否为线程安全
language 定义JSP页面所用的脚本语言,默认是Java
session 指定JSP页面是否使用session
isELIgnored 指定是否执行EL表达式
isScriptingEnabled 确定脚本元素能否被使用
  • JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
<%@ include file="文件相对 url 地址" %>
  • JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。

<%@ taglib uri="uri" prefix="prefixOfTag" %>

 

4、在JSP中使用Java

  jsp中写java代码有如下三种方式:

  <%! %>,这里面可以申明变量或方法,注意:这里面申明的变量是全局的

  <% %>,与上面的方法相比,这个方法的局部的

  <%= %>,用于输出表达式到浏览器,注意:这里面的表达式不能跟分号

  • 使用JSP中的隐式变量

  JSP文件提供了几个可以在脚本和表达式中可以使用的隐式变量,这些变量不需要在任何位置定义即可使用它们,JSP规范要求JSP的转换器和编译器提供这些变量,名字也要完全相同。从一个编译后的JSP文件中可以看到这样一些代码片段

   public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException { final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null; try {
response.setContentType("text/html; charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, false, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
out = pageContext.getOut();
_jspx_out = out;

  这里总共定义了8个隐式变量,分别是:

  • request、response

  HttpServletRequest类和HttpServletResponse类的实例

  • pageContext

   PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问

  • session

  HttpSession类的实例,如果在page指令中的session特性设置为假那么JSP中就没有这个变量

  • application、

  ServletContext类的实例,与应用上下文有关

  • config、

  ServletConfig类的实例,可以使用该对象访问JSP Servlet的配置,例如Servlet初始化参数

  • out、

  JspWriter类的实例,用于把结果输出至网页上

  • page

  类似于Java类中的this关键字,提供了请求特性和回话特性值、访问请求和响应、包含其他文件、转发请求的几个便利方法

  最后还有一个exception这里没有出现,这个变量需要通过page指令的isErrorPage特性设置为真,表示该JSP的目的是用于处理错误,才会出现这个变量。

  创建一个first.jsp文件,添加以下的代码

<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%!
private static final String DEFAULT_USER = "Guest";
%>
<%
String user = request.getParameter("user");
if(user == null){
user = DEFAULT_USER;
}
%>
<!DOCTYPE html>
<html>
<head>
<title>first user application</title>
</head>
<body>
hello, <%= user %> ! <br/><br/>
<form action="first.jsp" method="post">
输入用户名:<br/>
<input type="text" name="user"/><br/>
<input type="submit" value="Submit"/>
</form>
</body>
</html>

  编译运行,在浏览器中输入http://localhost:8080/hello-world/first.jsp就可以得到下面这个网页

  这里就实现了之前的Servlet,不过其实并不应该在JSP中使用Java

5、注释

  在JSP中实现代码注释的方法有四种:

  • XML注释
  <!-- 这是被注释的内容 -->

  但是这种类型的注释将被发送到客户端,浏览器将会忽略它,但是它会出现在响应的源代码中注释中的任何JSP代码都将会被处理,

<!-- 这是被注释的内容<%!private static final String DEFAULT_USER = "Guest";%> -->

  这里的java代码就将会被执行。

  • 传统的java行注释以及java块注释,也就是//...和/*...*/
<%
String user = request.getParameter("user");
// if(user == null){
// user = DEFAULT_USER;
// }
/*
String pwd = req.getParameter("pwd");
String sex = req.getParameter("sex");
*/
%>
  • JSP注释
<%-- JSP注释掉的内容 --%>

6、结合使用Servlet和JSP

  • 配置部署描述符中的JSP属性

    在空的web.xml文件(只包含<display-name>)中,添加以下内容:

  <jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspf</url-pattern>
<page-encoding>UTF-8</page-encoding>
<scripting-invalid>false</scripting-invalid>
<include-prelude>/WEB-INF/jsp/base.jspf</include-prelude>
<trim-directive-whitespaces>true</trim-directive-whitespaces>
<default-content-type>text/html</default-content-type>
</jsp-property-group>
</jsp-config>

  标签<jsp-config>中可以包含任意数目的</jsp-property-group>标签,这个属性用于区分不同JSP组的属性。例如为/WEB-ING/JSP/admin文件夹中所有的JSP定义一组通用的属性,为/WEB-ING/JSP/help定义另一组属性,那么需要通过定义<url-pattern>标签来区分不同的属性组,其中一个被设置为<url-pattern>/WEB-ING/JSP/admin/*.jsp</url-pattern>,另一个则被设置为<url-pattern>/WEB-ING/JSP/help/*.jsp</url-pattern>。

  <include-prelude>标签将告诉容器在所有属于该属性组中的JSP的头部添加文件/WEB-INF/jsp/base.jspf,可以用于定义公共变量、标签库声明或共享其他可作用于属性组所有的JSP资源。类似的<include-coda>标签定义了包含在组中所有JSP尾部的文件。在一个JSP组中可以同时多次使用这些标签。

  <page-encoding>与page指令的pageEncoding特性一致,因为JSP的默认内容类型为text/html,所以只需要通过<page-encoding>将字符编码设置为UTF-8即可。还可以使用<default-content-type>标签以其他默认的内容类型覆盖text/html。

  <trim-directive-whitespaces>标签告诉JSP转换器删除响应输出中的空白,只保留由指令、声明、脚本和其他JSP标签创建的文本。

  <scripting-invalid>标签设置为假时:允许在组中的所有JSP中使用Java。如果把这个设置为真,在组中使用Java将引起转换错误。标签<el-ignored>的作用类似,不过它对应的是page指令中的isELIgnored特性。如果它的值为真,那么组内的JSP将禁止使用表达式语言。它的默认值同样为假。

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

  以上是base.jspf的内容,该代码完成了两件事情:为所有的JSP导入这些类,并声明JSPL核心代码库。

  这是webapp的文件结构,将文件添加到WEB-INF下可以阻止用户通过浏览器访问这些JSP,因为WEB-INF目录中的文件是禁止通过Web访问的。依赖于由重定向Servlet和JSP提供的回话和请求特性的JSP都可以添加到WEB-INF中。

  先写一个简单的jsp:

<%@ page session="false" %>
<!DOCTYPE html>
<html>
<head>
<title>Customer Support</title>
</head>
<body>
<h2>Create a Ticket</h2>
<form method="POST" action="tickets" enctype="multipart/form-data">
<input type="hidden" name="action" value="create"/>
Your Name<br/>
<input type="text" name="customerName"><br/><br/>
Subject<br/>
<input type="text" name="subject"><br/><br/>
Body<br/>
<textarea name="body" rows="5" cols="30"></textarea><br/><br/>
<b>Attachments</b><br/>
<input type="file" name="file1"/><br/><br/>
<input type="submit" value="Submit"/>
</form>
</body>
</html>

  然后创建一个简单的Servlet在加上代码:

@WebServlet(
name = "TestServlet",
urlPatterns = {"/test"}
)
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/jsp/view/ticketForm.jsp")
.forward(request, response);
}
}

  然后在使用浏览器访问http://localhost:8080/hello-world/test时就是在访问这个JSP了

JavaWeb——JSP开发1的更多相关文章

  1. JavaWeb——JSP开发2

    使用JSP+Servlet实现文件的上传和下载功能 1.文件模型 首先是文件本身,这里创建一个类记录文件的名字和内容: public class Attachment { private String ...

  2. javaweb的开发模式

    SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. 一.JSP+JavaBean开发模式 1 ...

  3. Java之JavaWeb项目开发开始准备

    操作系统:Mac OS 10.11.6 Tomcat版本:9.0.0.M17 前言:部署Tomcat可以参考我一年前做的笔记:<在MAC下搭建JSP开发环境>,也可以参考大神写的挺好的&l ...

  4. 2017.11.6 JavaWeb-----第七章 JavaWeb常用开发模式与案例

    JavaWeb-----第七章 JavaWeb常用开发模式与案例 (1)单纯的JSP页面开发模式 通过在JSP中的脚本标记,直接在JSP页面中实现各种功能.称为"单纯的JSP页面编程模式&q ...

  5. JavaWeb:JSP技术基础

    JavaWeb:JSP技术 快速开始 介绍 JSP全称Java Server Pages,是一种动态网页开发技术.它使用JSP标签在HTML网页中插入Java代码.标签通常以<%开头以%> ...

  6. IntelliJ IDEA安装及jsp开发环境搭建

    一.前言 现在.net国内市场不怎么好,公司整个.net组技术转型,就个人来说还是更喜欢.net,毕竟不是什么公司都像微软一样财大气粗开发出VS这样的宇宙级IDE供开发者使用,双击sln即可打开项目, ...

  7. JSP开发环境配置问题解答

    有过JSP开发经验的同学对于JSP开发环境的配置一定非常的很有感触,十分的繁琐,有时因为一个小的问题导致我们配置的配置前功尽弃,本篇我将重点带领大家一起探讨一下关于JSP环境配置的一些常见问题,及解决 ...

  8. windows上JSP开发环境全搭建

    JSP开发环境全搭建 最近需要用到JSP做项目,所以要配置JSP的开发环境,总结一下配置步骤以备以后再配置需要. 配置JAVA开发环境,配置JDK 下载JDK,在这里下载开发所需的JDK,可以根据自己 ...

  9. 一.JSP开发的工具下载与环境搭建

    JSP技术的强势: (1)一次编写,到处运行.在这一点上Java比PHP更出色,除了系统之外,代码不用做任何更改. (2)系统的多平台支持.基本上可以在所有平台上的任意环境中开发,在任意环境中进行系统 ...

随机推荐

  1. 【深入浅出-JVM】(序)

    本系列主要是让一个刚入门的 java 开发者,也能愉快的从零开始成为一个真正的 jvm 大神. 大纲 java 虚拟机的定义.总体架构.常用配置 垃圾回收算法.各类垃圾回收器 java 虚拟机对多线程 ...

  2. 你不得不知的几个互联网ID生成器方案

    服务化.分布式已成为当下系统开发的首选,高并发操作在数据存储时,需要一套id生成器服务,来保证分布式情况下全局唯一性,以确保系统的订单创建.交易支付等场景下数据的唯一性,否则将造成不可估量的损失. 基 ...

  3. 数据结构-循环队列(Python实现)

    今天我们来到了循环队列这一节,之前的文章中,我介绍过了用python自带的列表来实现队列,这是最简单的实现方法. 但是,我们都知道,在列表中删除第一个元素和删除最后一个元素花费的时间代价是不一样的,删 ...

  4. linux 不重启识别新添加的硬盘

    1.fdisk -l 看有没有新的磁盘 oebiotech@hadoop08:/media/nbc9$ sudo fdisk -l |grep sdl 2.查看主机总线 oebiotech@hadoo ...

  5. 【题解】P2078 朋友-C++

    题目传送门 这道题目就是一个模板并查集 但是!唯一不同的地方在于,这道题的编号有负数. C++的map你忘了吗!!!下表可以是任意类型. 所以把fa数组开成一个int->int的map就可以了 ...

  6. VS2012 BIDS之Reporting Service/SSRS 项目2--开发过程问题总结(全)

    由刚开始的接触到现在做出来一个基本完整的SSRS的项目,学到了比较多的知识,和大家共享. 上一篇学习总结可能有些问题,一起修正和总结. ================================ ...

  7. 【CYH-02】noip2018数论模拟赛:比赛通知栏

    鉴于公开赛有时可能无法更改比赛描述呢... 所以我们准备在这里(和团队宣言里)发布一些比赛公告. 请及时关注

  8. Git对象

    上一节了解了 Git 的一个重要的概念:暂存区. 暂存区是一个介于工作区和版本库的中间状态,当执行commit时,实际上是将暂存区的内容提交大版本库中,而执行add则是将本次变更添加到暂存区. 上一节 ...

  9. python以ATM+购物车剖析一个项目的由来及流程

    ATM+购物车 一个项目是如何从无到有的 ''' 项目的由来,几个阶段 0.采集项目需求 1.需求分析 2.程序的架构设计 3.分任务开发 4.测试 5.上线运行 ''' 需求分析: # 对项目需求进 ...

  10. 在Linux上安装JDK8-教程

    xl_echo编辑整理.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! --- > 这里使用的服务 ...