【从零开始的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 here</title>
</head>
<body>
	<table>
		<tr>
			<th>year</th>
			<th>salary</th>
		</tr>
		<tr>
			<td>0</td>
			<td>1500</td>
		</tr>
		<tr>
			<td>1</td>
			<td>1650</td>
		</tr>
		<tr>
			<td>2</td>
			<td>1800</td>
		</tr>
		<tr>
			<td>3</td>
			<td>1950</td>
		</tr>
		<tr>
			<td>4</td>
			<td>2100</td>
		</tr>
		<tr>
			<td>5</td>
			<td>2250</td>
		</tr>
		<tr>
			<td>6</td>
			<td>2550</td>
		</tr>
		<tr>
			<td>7</td>
			<td>2850</td>
		</tr>
		<tr>
			<td>8</td>
			<td>3150</td>
		</tr>
		<tr>
			<td>9</td>
			<td>3450</td>
		</tr>
		<tr>
			<td>10</td>
			<td>3750</td>
		</tr>
		<tr>
			<td>11</td>
			<td>4125</td>
		</tr>
	</table>
</body>
</html>

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

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

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<table>
		<tr>
			<th>year</th>
			<th>salary</th>
		</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>

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

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("<!DOCTYPE html>\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta charset=\"UTF-8\">\r\n");
      out.write("<title>Insert title here</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("	<table>\r\n");
      out.write("		<tr>\r\n");
      out.write("			<th>year</th>\r\n");
      out.write("			<th>salary</th>\r\n");
      out.write("		</tr>\r\n");
      out.write("		");

		//这里的注释乱码了,所以我把它删掉了
		//这里就是把jsp中的java代码原封不动的搬过来
		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>");
		}
		
      out.write("\r\n");
      out.write("	</table>\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } 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);
    }
  }
}

要记住,JSP本质就是Servlet。

JSP基本语法

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

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

JSP代码块

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

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

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

这是往页面输出:

out.println("Hello world!");

要区分一下。

JSP声明构造块

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

如:

<%!
	public int add(int a,int b){
		return a+b;
	}
%>

JSP输出指令

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

如:

<%= "<b>"+name+"</b>" %>

这个就是out.println()

JSP处理指令

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

JSP常用处理指令

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

JSP注释

<%--注释--%>

综合训练

要求:列出1000以内的质数

  • 使用List保存所有有效的质数
  • 将结果打印到页面,格式为"<h1>X是质数</h1>"
<%--导入一个包 --%>
<%@ 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("<h1>"+i+"</h1>");
			Primes.add(i);
		}
	}
%>

<%
	for(int p:Primes){
		out.println("<h1>"+p+"是质数</h1>");
	}
%>

在这里插入图片描述

JSP页面重用

<%@page contentType="text/html; charset=utf-8" %>
要闻|推荐|财经|娱乐
<%
	out.println("<h1>新闻标题</h1>");
	out.println("<p>新闻正文</p>");
%>
<hr/>
Copyright 2019-2022

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

header.jsp:

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

footer.jsp:

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

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

<%@page contentType="text/html; charset=utf-8" %>
<%@include file="Include/header.jsp"%>
<%
	out.println("<h1>新闻标题</h1>");
	out.println("<p>新闻正文</p>");
%>
<%@include file="Include/footer.jsp"%>

页面效果不变。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

karshey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值