从零开始的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选择器样式