1. Jsp是什么?
jsp的全拼是java server pages。Java的服务器页面。
jsp的主要作用是代替Servlet程序回传html页面的数据。
因为Servlet程序回传html页面数据是一件非常繁锁的事情。开发成本和维护成本都极高。
Servlet回传html页面数据的代码:
public class PringHtml extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 通过响应的回传流回传html页面数据
resp.setContentType("text/html; charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.write("<!DOCTYPE html>\r\n");
writer.write(" <html lang=\"en\">\r\n");
writer.write(" <head>\r\n");
writer.write(" <meta charset=\"UTF-8\">\r\n");
writer.write(" <title>Title</title>\r\n");
writer.write(" </head>\r\n");
writer.write(" <body>\r\n");
writer.write(" 这是html页面数据 \r\n");
writer.write(" </body>\r\n");
writer.write("</html>\r\n");
writer.write("\r\n");
}
}
jsp回传一个简单html页面的代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
html页面主体
</body>
</html>
jsp的小结:
(1)创建jsp的页面
打开菜单目录依次按顺序打开:File==》New ==》JSP/JSPX
输入文件名,确认之后,回车就可以了。
(2)jsp如何访问:
jsp页面和html页面一样,都是存放在web目录下。访问也跟访问html页面一样。
比如:
在web目录下有如下的文件:
2、 jsp的本质是什么?
jsp页面本质上是一个Servlet程序。
第一次访问jsp页面的时候。Tomcat服务器会帮我们把jsp页面翻译成为一个java源文件。并且对它进行编译成为.class字节码程序。我们打开java源文件可以看到里面的内容是:
查看源代码发现,HttpJspBase类直接地继承了HttpServlet类。说明jsp翻译出来的java类,它间接了继承了HttpServlet类。说明翻译出来的是一个Servlet程序。
通过java源代码可以得到结果:jsp就是Servlet程序。
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, "JSPs only permit GET POST or HEAD");
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;charset=UTF-8");
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("<html>\r\n");
out.write("<head>\r\n");
out.write(" <title>Title</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write(" a.jsp页面\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
} 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);
}
}
3、jsp头部的page指令
jsp的page指令可以修改jsp页面中一些重要的属性,或者行为。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
4、jsp中的常用脚本
4.1、声明脚本
声明脚本的格式是: <%! 声明java代码 %>
作用:可以给jsp翻译出来的java类定义属性和方法甚至是静态代码块。内部类等。
(1)声明类属性
<%--1、声明类属性--%>
<%!
private Integer id;
private String name;
private static Map<String,Object> map;
%>
(2)声明static静态代码块
<%--2、声明static静态代码块--%>
<%!
static {
map = new HashMap<String,Object>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
}
%>
(3)声明类方法
<%--3、声明类方法--%>
<%!
public int abc(){
return 12;
}
%>
(4)声明内部类
<%--4、声明内部类--%>
<%!
public static class A {
private Integer id = 12;
private String abc = "abc";
}
%>
声明脚本代码翻译对照:
4.2表达式脚本
表达式脚本的格式是:<%=表达式%>
表达式脚本的作用是:的jsp页面上输出数据。
表达式脚本的特点:
1、所有的表达式脚本都会被翻译到_jspService() 方法中
2、表达式脚本都会被翻译成为out.print()输出到页面上
3、由于表达式脚本翻译的内容都在_jspService() 方法中,所以_jspService()方法中的对象都可以直接使用。
4、表达式脚本中的表达式不能以分号结束。
(1)输出整型
<%=12 %> <br>
(2)输出浮点型
<%=12.12 %> <br>
(3) 输出字符串
<%="我是字符串" %> <br>
(4)输出对象
<%=map%> <br>
<%=request.getParameter("username")%>
翻译对照:
4.3、代码脚本
代码脚本的格式是:
<%
java 语句
%>
代码脚本的作用是:可以在jsp页面中,编写我们自己需要的功能(写的是java语句)
代码脚本的特点是:
1、代码脚本翻译之后都在_jspService方法中
2、代码脚本由于翻译到_jspService()方法中,所以在_jspService()方法中的现有对象都可以直接使用。
3、还可以由多个代码脚本块组合完成一个完整的java语句。
4、代码脚本还可以和表达式脚本一起组合使用,在jsp页面上输出数据
(1)代码脚本----if 语句
<%--1.代码脚本----if 语句--%>
<%
int i = 13 ;
if (i == 12) {
%>
<h1>中国</h1>
<%
} else {
%>
<h1>中国加油!</h1>
<%
}
%>
<br>
(2)代码脚本----for 循环语句
<%--2.代码脚本----for 循环语句--%>
<table border="1" cellspacing="0">
<%
for (int j = 0; j < 10; j++) {
%>
<tr>
<td>第 <%=j + 1%>行</td>
</tr>
<%
}
%>
</table>
(3)翻译后java文件中_jspService方法内的代码都可以写
<%--3.翻译后java文件中_jspService方法内的代码都可以写--%>
<%
String username = request.getParameter("username");
System.out.println("用户名的请求参数值是:" + username);
%>
翻译之后的对比:
5、jsp中的三种注释
5.1、html注释
<!-- 这是html注释 -->
html注释会被翻译到java源代码中。在_jspService方法里,以out.writer输出到客户端
5.2、java注释
<%
// 单行java注释
/* 多行java注释 */
%>
java注释会被翻译到java源代码中
5.3、jsp注释
<%-- 这是jsp注释 --%>
jsp注释可以注掉,jsp页面中所有代码。