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

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始的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"%>

页面效果不变。

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

以上是关于从零开始的Java开发2-10-3 JSP入门:JSP介绍语法和页面重用的主要内容,如果未能解决你的问题,请参考以下文章

从零开始的Java开发2-8-1 HTML入门:标签表格表单

从零开始的Java开发2-8-2 CSS入门:CSS选择器样式

我是如何从零开始构建一个jsp项目的

从零开始的Java开发2-10-2 Servlet入门:Servlet开发步骤请求参数的发送与接收Get和Post注解

手把手 从零开始学习JAVA(入门基础)

从零开始的Java开发2-9-1 JavaScript入门:语法JS对表单元进行设置事件与DOM