JSP 基础详解
来源:互联网 发布:restful框架 php 编辑:程序博客网 时间:2024/06/08 05:42
1.简介
> HTML擅长显示一个网页,但是它不能调用Java代码,它是一个静态页面。
> Servlet擅长调用Java程序,但是Servlet不擅长显示一个页面。
> HTML + Servlet = JSP(Java Server Pages)
> JSP集合HTML和Servlet的优点,既可以编写一个HTML页面,又可以调用Java程序。
> JSP不能脱离服务器运行。
> JSP实际上就是一个披着HTML皮的Servlet。
> JSP本质上就是一个Servlet。
2.运行原理
> JSP本质上就是一个Servlet。
> 当我们访问一个JSP时,服务器会现将JSP文件转换为一个Java类,然后在调用Java类去处理我们的请求。
> 而这个Java类就是一个Servlet。
> jsp --翻译--> java --编译--> class
> 我们发现在镜像服务器的work目录中,Tomcat自动生成了一个java文件。
这个java文件的名字是index_jsp.java,而我们的jsp文件叫index.jsp,实际上这个文件就是从jsp翻译出的java文件。
> 我们发现这个类继承HttpJspBase,而HttpJspBase继承了HttpServlet,所以从类的的角度讲它就是一个Servlet。
> 在总的web.xml文件中也发现了jsp相关的配置信息(我们项目当中的web.xml继承总的web.xml),由此证明,JSP就是Servlet。
(1) index.jsp页面
<%@page import="java.util.Date"%><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body> <h1>这是我的第一个JSP网页</h1> <!-- 编写一个JSP的脚本片段 --> <% //创建一个对象 Date date = new Date(); //向控制台输出一个内容 System.out.println("Hello JSP"); %> <!-- 使用JSP表达式将对象在网页中输出 --> <h1><%=date %></h1></body></html>
(2) 翻译过后的 index_jsp.java 类
package org.apache.jsp;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;import java.util.Date;public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory(); private static java.util.List _jspx_dependants; private javax.el.ExpressionFactory _el_expressionfactory; private org.apache.AnnotationProcessor _jsp_annotationprocessor; public Object getDependants() { return _jspx_dependants; } public void _jspInit() { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName()); } public void _jspDestroy() { } public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this; JspWriter _jspx_out = null; 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("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n"); out.write("<html>\r\n"); out.write("<head>\r\n"); out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; 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("\t<h1>这是我的第一个JSP网页</h1>\r\n"); out.write("\t<!-- 编写一个JSP的脚本片段 -->\r\n"); out.write("\t"); //创建一个对象 Date date = new Date(); //向控制台输出一个内容 System.out.println("Hello JSP"); out.write("\r\n"); out.write("\t<!-- 使用JSP表达式将对象在网页中输出 -->\r\n"); out.write("\t<h1>"); out.print(date ); out.write("</h1>\r\n"); out.write("</body>\r\n"); out.write("</html>"); } catch (Throwable t) { if (!(t instanceof SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { out.clearBuffer(); } catch (java.io.IOException e) {} if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); else log(t.getMessage(), t); } } finally { _jspxFactory.releasePageContext(_jspx_page_context); } }}
3.JSP 基本语法
(1) JSP 模板元素
JSP中的模板元素指就是JSP页面的HTML代码,模板元素中的内容会作为out.write()的参数,最终输出到页面中。
(2) JSP脚本元素
在JSP中我们主要通过脚本元素来编写Java代码,这些Java代码一般会在页面被访问时调用,JSP脚本元素主要分三种:脚本片段、表达式还有声明。
① 脚本片段
格式: <% %>
在脚本片段中可以直接编写Java代码,脚本片段中的内容会原封不动的复制到jsp对应的java文件中的指定位置。
在JSP页面中可以编写多个脚本片段,但是要求多个脚本片段之间的结构完整。
脚本片段中的内容会复制到对应的java文件中的service()方法 ,所以在service()方法中能写什么,在脚本片段中就能写什么。
② 表达式
格式:<%= %>
JSP表达式用来在页面中输出一个对象。
JSP表达式中的内容最终会作为out.print()的参数输出到页面中。
所以out.print()可以接收什么类型的参数,表达式中就可以写什么对象。
③ 声明
格式:<%! %>
声明中的内容会直接放到JSP对应的java文件的类中,所以在类里可以写啥在声明中就能写啥,知道就行,不用。
<%@page import="java.util.Date"%><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body> <%! public int sum(int a , int b){ return a+b; } %> <%=sum(123,456) %></body></html>
(3) 注释
格式: <%-- --%>
JSP中可以使用的注释:
①JSP注释 <%-- --%>
②HTML注释 <!-- -->
③java注释 // /**/
4.JSP指令
(1) page指令:page指令用来告诉JSP引擎如何翻译JSP文件。
格式:<%@ 指令名 属性名1=”属性值1” 属性名2=”属性值2” %>
<%--Page指令的信息都在jsp页面的前面进行设置--%><%@page import="java.util.Date"%><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%--Page指令常用属性名和属性值说明--%>session:页面中是否可以使用session对象,需要一个布尔值,默认值是true,可以使用 ; 如果将该值设置为false,则不能直接使用session对象。import:用来导包。errorPage:当页面中出现异常以后,转发到的页面。isErrorPage:当前页面是否是一个错误页面,需要一个布尔值,默认是false 当该值设置true可以在jsp中使用exception对象, 设置false不能使用。language:用来指定JSP将会被翻译为的语言,这个属性的默认值java,可选值java。contentType:用来指定我们JSP的编码类型, 一般我们使用:text/html;charset=utf-8pageEncoding: 告诉jsp引擎当前jsp使用的编码格式。extends:指定jsp对应java类的父类。isELIgnored:是否忽略EL表达式,需要一个布尔值,默认是false不忽略 。 如果将该值设置true,则页面中的EL表达式将不会自动解析。
(2) include 指令
include指令叫做静态包含,用于将目标页面包含到当前页面 :<%@ include file="/include/2.jsp" %>,使用静态包含时,只会翻译当前的jsp页面,而不会翻译被包含页面。
适用于将网页中通用的部分提出来,然后在当前页面通过include静态包含进来。
5.JSP 动作标签
格式:<jsp:标签名 属性名="属性值"></jsp:标签名>
jsp动作标签,使用形式和标签很像,但是动作标签都是有服务器解析的, 动作标签在服务器会被转换为Java代码。
(1) forward标签: 用来在jsp页面中将请求转发到另一个页面
<jsp:forward page="/index.jsp"></jsp:forward>
(2) include标签:动态包含时,当前页面和被包含的页面都会被翻译为java文件,动态包含,会在页面执行时,调用如下:include(request, response, "/include2/2.jsp", out, false),这个方法的作用就是,将一个页面动态包含进当前页面中。
<jsp:include page="/include2/2.jsp"></jsp:include>
(3) <%@include%>和<jsp:include>的区别:
<%@include%>:页面请求之前预编译,所有代码包含进来之后,一起进行处理,把所有代码合在一起,编译成一个servlet 。
<jsp:include>:所有代码分别处理,在页面被请求的时候才编译,被编译成多个servlet,页面语法相对独立,处理完成之后再将代码的显示结果(处理结果)组合进来。
6.隐含对象
隐含对象也叫内置对象,指的是可以在JSP中直接使用的对象,因为在JSP对应的java类中已经声明了这九个对象,所以可以在jsp页面中直接使用(在jsp页面中"out+/"就可以看到隐含对象)。
(1) pageContext
类型:PageContext
作用:pageContext对象代表的是当前页面的上下文,通过它可以获取到其他隐含对象
(2) request
类型:HttpServletRequest
(3) session
类型:HttpSession
(4) application
类型:ServletContext
(5) config
类型:ServletConfig
作用:代表的是当前JSP的配置信息。
(6) response
类型:HttpServletResponse
作用:和Servlet里那个response一样,代表的是服务器发送给浏览器的响应报文。
(7) out
类型:JspWriter
作用:向浏览器返回内容
(8) page
类型:Object
作用:在jsp对应的java文件中,有这么一行代码 Object page = this,所以page代表的就是当前对象。
(9) exception
类型:Throwable
作用:代表是页面中的异常信息,通过它可以获取到异常。
7.域对象:
域对象可以在不同的 WEB资源(主要指JSP和Servlet ) 之间共享数据。
JavaWeb中一共有四个域对象:pageContext request session application
在jsp中可以获取到全部四个域对象,在Servlet中只能获取到三个,没有pageContext,因为pageContext 代表当前页面,只在当前页面起作用。
每一个域对象中都维护着一个map,用来保存数据。
我们域都都共有的三个方法:
void setAttribute(String name , Object value) --> 向域中设置一个属性
Object getAttribute(String name) --> 根据属性名从域中获取属性值
void removeAttribute(String name) --> 从域中根据属性名移除指定的属性
(1) pageContext - 类型:PageContext
作用:它是page域的域对象,page域就是当前页面,一旦切换页面则page域中的属性全部丢失,主要用来在jsp和标签之间来传递数据。
(2) request - 类型: HttpServletRequest
作用:它是request域的域对象,request域代表的是当前请求,一旦发送两次请,则request中的属性全部丢失。主要是在转发时共享数据的。在Servlet页面可以直接使用。
(3) session - 类型:HttpSession
作用:它是session域的域对象,session域代表的是当前会话,一旦会话停则session域中属性丢失,会话指一次打开浏览器到关闭浏览器的过程,不同的浏览器是不同的会话。
在Servlet页面不可直接使用,可以通过HttpSession session = request.getSession();来获取session对象来使用。
(4) application - 类型:ServletContext
作用:它是application域的域对象,application域代表的是整个web应用,只要项目不停止,则application域中的属性就不会丢失,主要用来在web应用中共享数据。
在Servlet页面不可直接使用,可以通过ServletContext application = getServletContext();来获取application 对象来使用。
(4) 练习:显示一个学生列表
创建一个ListServlet,它直接从数据库中查询一组学生列表。
在list.jsp中将这组学生列表显示出来。
① 在ListServlet中:
public class ListServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //去数据库查询一组学生信息 //创建一个学生列表 List<Student> list = new ArrayList<Student>(); //向list添加学生 list.add(new Student("孙悟空", 18, "男", "花果山")); list.add(new Student("猪八戒", 28, "男", "高老庄")); list.add(new Student("牛魔王", 48, "男", "牛头山")); list.add(new Student("玉兔精", 16, "女", "广寒宫")); list.add(new Student("红孩儿", 8, "男", "火云洞")); //将list放入到域对象中 //域对象能用小的就尽量不要用大 request.setAttribute("list", list); //转发到list.jsp request.getRequestDispatcher("/list.jsp").forward(request, response); }}
② 在Student类中:
public class Student { private String name; private int age; private String gender; private String address; public Student() { super(); } public Student(String name, int age, String gender, String address) { super(); this.name = name; this.age = age; this.gender = gender; this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + ", gender=" + gender + ", address=" + address + "]"; }}
③ 在list.jsp页面中
<%@page import="com.atguigu.bean.Student"%><%@page import="java.util.List"%><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body> <% //获取学生列表 List<Student> list = (List<Student>)request.getAttribute("list"); %> <h3 align="center">学生列表</h3> <table align="center" border="1" width="50%"> <tr> <td>姓名</td> <td>年龄</td> <td>性别</td> <td>地址</td> <td colspan="2">操作</td> </tr> <% for(Student stu : list){ %> <tr> <td><%=stu.getName() %></td> <td><%=stu.getAge() %></td> <td><%=stu.getGender() %></td> <td><%=stu.getAddress() %></td> <td><a href=#>删除</a></td> <td><a href=#>修改</a></td> </tr> <% } %> </table></body></html>
阅读全文
1 0
- jsp基础知识点详解
- jsp基础知识点详解
- JSP基础详解
- JSP基础详解
- JSP 基础详解
- Servlet/JSP配置详解(基础篇)
- Servlet/JSP配置详解(非常基础)
- J2EE基础--Servlet/JSP的配置超详解
- jsp基础
- jsp 基础
- JSP基础
- JSP基础
- JSP基础
- Jsp基础
- JSP基础!
- JSP基础
- JSP基础
- JSP基础
- iPhone 开发——CocoaPods使用
- Android 比例缩放viewgroup
- Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结
- admob数据爬取
- vim编辑器设置
- JSP 基础详解
- hadoop学习(二)----HDFS简介及原理
- 1044. 火星数字(20)--Python
- MIPI-DSI 三种 Video Mode 理解
- 字母和数字键的键码值(KeyCode)
- 学习seo教程需要学习更需要提升
- java 生成2维码
- 【高效代码调错系列之代码规范】——让软件学会自己寻找缺陷
- js模块历程