• 【从零开始的Java开发】2-10-3 JSP入门:JSP介绍、语法和页面重用


    JSP入门

    为什么会有JSP

    因为Servlet的一些缺点:

    • 静态HTML与动态Java代码混合在一起,难以维护
    • Servlet用out.println()语句输出,开发效率低下
    • Eclipse很难在开发中发现错误,调试困难

    JSP介绍

    • JSP,即Java Server Pages,Java服务器页面
    • JSP是J2EE的功能模块,由Web服务器执行
    • JSP的作用就是降低动态网页开发难度

    JSP特点

    • JSP使用简单,短时间学习便可上手使用
    • JSP可将Java代码与HTML分离,降低开发难度
    • JSP的本质就是Servlet

    JSP运行要求

    • 可正常运行的Tomcat
    • 拓展名必须是 .jsp
    • JSP页面应放在Web应用程序目录下

    第一个JSP

    案例描述:

    一个公司的薪资制度如下:

    • 新员工:基本工资1500
    • 工作5年内:每年工资上浮基本工资的10%
    • 工作5-10年内:20%
    • 工作10年以上:25%

    要求列出工资试算表。

    它的html如下:

    DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title heretitle>
    head>
    <body>
    	<table>
    		<tr>
    			<th>yearth>
    			<th>salaryth>
    		tr>
    		<tr>
    			<td>0td>
    			<td>1500td>
    		tr>
    		<tr>
    			<td>1td>
    			<td>1650td>
    		tr>
    		<tr>
    			<td>2td>
    			<td>1800td>
    		tr>
    		<tr>
    			<td>3td>
    			<td>1950td>
    		tr>
    		<tr>
    			<td>4td>
    			<td>2100td>
    		tr>
    		<tr>
    			<td>5td>
    			<td>2250td>
    		tr>
    		<tr>
    			<td>6td>
    			<td>2550td>
    		tr>
    		<tr>
    			<td>7td>
    			<td>2850td>
    		tr>
    		<tr>
    			<td>8td>
    			<td>3150td>
    		tr>
    		<tr>
    			<td>9td>
    			<td>3450td>
    		tr>
    		<tr>
    			<td>10td>
    			<td>3750td>
    		tr>
    		<tr>
    			<td>11td>
    			<td>4125td>
    		tr>
    	table>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    在这里插入图片描述
    对于这种既定规则的重复劳动,我们是否可以用更加智能的方式去完成呢?当然可以。

    接下来我们将salary.html变成salary.jsp:

    DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title heretitle>
    head>
    <body>
    	<table>
    		<tr>
    			<th>yearth>
    			<th>salaryth>
    		tr>
    		<%
    		//写的是标准的Java代码
    		//假设最多可以在一个公司打工50年
    		for (int i = 0; i <= 50; i++) {
    			out.println("<tr>");
    			out.println("<td>" + i + "td>");
    			int salary = 0;
    			if (i <= 5) {
    				salary = 1500 + 150 * i;
    			} else if (i > 5 && i <= 10) {
    				salary = 1500 + 300 * (i - 5) + 150 * 5;
    			} else {
    				salary = 1500 + 150 * 5 + 300 * 5 + 375 * (i - 10);
    			}
    			out.println("<td>" + salary + "td>");
    			out.println("tr>");
    		}
    		%>
    	table>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    效果:
    在这里插入图片描述

    JSP执行过程

    在这里插入图片描述
    JSP转译过程
    在这里插入图片描述
    我们刚刚写的salary.jsp的Java文件什么样的呢?

    文件路径:D:\apache-tomcat-8.5.82\work\Catalina\localhost\MyJsp\org\apache\jsp

    里面会有salary_jsp.java,我们把它打开看一下:

    在这里插入图片描述

    找到_jspService:(大概看一下就好了)

    public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
          throws java.io.IOException, javax.servlet.ServletException {
    
        final java.lang.String _jspx_method = request.getMethod();
        if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
          response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
          return;
        }
    
        final javax.servlet.jsp.PageContext pageContext;
        javax.servlet.http.HttpSession session = null;
        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");
          pageContext = _jspxFactory.getPageContext(this, request, response,
          			null, true, 8192, true);
          _jspx_page_context = pageContext;
          application = pageContext.getServletContext();
          config = pageContext.getServletConfig();
          session = pageContext.getSession();
          out = pageContext.getOut();
          _jspx_out = out;
    
          out.write("\r\n");
          out.write("\r\n");
          out.write("\r\n");
          out.write("\r\n");
          out.write("Insert title here\r\n");
          out.write("\r\n");
          out.write("\r\n");
          out.write("	\r\n");
          out.write("		\r\n");
          out.write("			\r\n");
          out.write("			\r\n");
          out.write("		\r\n");
          out.write("		");//这里的注释乱码了,所以我把它删掉了//这里就是把jsp中的java代码原封不动的搬过来for(int i =0; i <=50; i++){
    			out.println("");
    			out.println("");int salary =0;if(i <=5){
    				salary =1500+150* i;}elseif(i >5&& i <=10){
    				salary =1500+300*(i -5)+150*5;}else{
    				salary =1500+150*5+300*5+375*(i -10);}
    			out.println("");
    			out.println("");}
    		
          out.write("\r\n");
          out.write("	
    yearsalary
    " + i + " " + salary + "
    \r\n"
    ); out.write("\r\n"); out.write(""); } catch (java.lang.Throwable t) { if (!(t instanceof javax.servlet.jsp.SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { if (response.isCommitted()) { out.flush(); } else { out.clearBuffer(); } } catch (java.io.IOException e) {} if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); else throw new ServletException(t); } } finally { _jspxFactory.releasePageContext(_jspx_page_context); } } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84

    要记住,JSP本质就是Servlet。

    JSP基本语法

    按功能分可分为以下四种:

    • JSP代码块
    • JSP声明构造块
    • JSP输出指令
    • JSP处理指令

    JSP代码块

    • JSP代码块用于在JSP中嵌入Java代码
    • 语法:<% Java代码块 %>

    注意:
    这是往控制台输出:

    System.out.println("Hello world!");
    
    • 1

    这是往页面输出:

    out.println("Hello world!");
    
    • 1

    要区分一下。

    JSP声明构造块

    • JSP声明构造块用于声明变量或方法
    • 语法:<%! 声明语句 %>

    如:

    <%!
    	public int add(int a,int b){
    		return a+b;
    	}
    %>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    JSP输出指令

    • JSP输出指令用于在JSP页面中显示java代码执行结果
    • JSP输出指令语法:<%= Java代码%>

    如:

    <%= ""+name+"" %>
    
    • 1

    这个就是out.println()

    JSP处理指令

    • 用于提供JSP执行过程中的辅助信息
    • 语法:<%@ jsp指令 %>

    JSP常用处理指令

    • <%@ page %> :定义当前JSP页面全局设置
    • <%@ include %>:将其他JSP页面与当前JSP页面合并
    • <%@ taglib %>:引入JSP标签库

    JSP注释

    <%--注释--%>
    
    • 1

    综合训练

    要求:列出1000以内的质数

    • 使用List保存所有有效的质数
    • 将结果打印到页面,格式为"

      X是质数

      "
    <%--导入一个包 --%>
    <%@ page import="java.util.*" contentType="text/html; charset=utf-8"%>
    
    <%!
    //声明一个方法
    	boolean isPrime(int num){
    		boolean flag=true;
    		for(int i=2;i<num;i++){
    			if(num%i==0){
    				flag=false;
    				break;
    			}
    		}	
    		return flag;
    	}
    %>
    
    <%
    
    	List<Integer> Primes=new ArrayList();
    	for(int i=2;i<=1000;i++){	
    		if(isPrime(i)){
    			//out.println("

    "+i+"

    ");
    Primes.add(i); } } %> <% for(int p:Primes){ out.println("

    "+p+"是质数

    "
    ); } %>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    在这里插入图片描述

    JSP页面重用

    <%@page contentType="text/html; charset=utf-8" %>
    要闻|推荐|财经|娱乐
    <%
    	out.println("

    新闻标题

    "
    ); out.println("

    新闻正文

    "
    ); %> <hr/> Copyright 2019-2022
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    原始页面如下:
    在这里插入图片描述
    我们在webapp下创建一个文件夹Include,里面有两个jsp:header和footer。

    header.jsp:

    <%@page contentType="text/html; charset=utf-8" %>
    要闻|推荐|财经|娱乐
    
    • 1
    • 2

    footer.jsp:

    <%@page contentType="text/html; charset=utf-8" %>
    <hr/>
    Copyright 2019-2022
    
    • 1
    • 2
    • 3

    则刚刚的原始页面代码可以改成:

    <%@page contentType="text/html; charset=utf-8" %>
    <%@include file="Include/header.jsp"%>
    <%
    	out.println("

    新闻标题

    "
    ); out.println("

    新闻正文

    "
    ); %> <%@include file="Include/footer.jsp"%>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    页面效果不变。

    这样的话,很多元素就可以不用重新开发,直接引用就好。

  • 相关阅读:
    Python气象绘图笔记——常用气象绘图函数脚本封装与使用记录
    疫苗预约管理系统,疫苗预约系统,新冠疫苗预约系统毕业设计作品
    搭建grpc服务(二)—Java版
    addr2line 回复“问号”问题的解决和一些发现
    基于UCOSII的DMA-SPI通信
    Go Web——Gin表单处理
    阿里云/腾讯云国际站账号:私服游戏服务器:阿里云CTO周靖人:AI时代,为什么阿里云一定要做开源
    回归预测 | MATLAB实现MLP多层感知机模型多输入多输出回归预测
    腾讯云短信验证登录
    数字孪生电力系统,可视化应用实现科学调度的电子设备
  • 原文地址:https://blog.csdn.net/karshey/article/details/126786693