JavaWeb开发之JSP
什么是JSP
JSP(Java Server Page)是Java服务器端动态页面技术。是sun公司制订的一种服务器端的动态页面生成技术规范。
为什么要使用JSP
因为直接使用Servlet,虽然也可以生成动态页面。但是,编写繁琐(需要使用out.println来输出),并且维护困难(如果页面发生了改变,需要修改Java代码),所以sun指定了JSP规范。
JSP与Servlet的关系
JSP其实是一个以.jsp为后缀的文件,容器会自动将.jsp文件转换成一个.java文件(其实就是一个Servlet),然后调用该Servlet。所以,从本质上讲,JSP其实就是一个Servlet。
如何写一个JSP文件
step1:创建一个以“.jsp”为后缀的文件
step2:在该文件里面,可以添加如下的内容
1)HTML(CSS、JS):直接写即可
2)Java代码:
形式一:Java代码片段:<% Java代码 %>
形式二:JSP表达式:<%= Java表达式 %>
形式三:JSP声明:<%! %>
3)指令
JSP是如何运行的
- step1:容器依据.jsp文件生成.java文件(也就是先转换成一个Servlet)
1)HTML(CSS、JS)放到service方法里,使用out.write输出
2)<% %>也放到service方法里,照搬,不改动。
3)<%= %>也会放到service方法里,使用out.print输出。
4)<%! %>给Servlet添加新的属性或者新的方法。
这样就把一个JSP变成了一个Servlet容器。
注意事项:out.writer方法只能输出简单的字符串,对象是没法输出的。优点是把null自动转换成空字符串输出。如:<% out.println(new Date()); %>不能用writer - step2:容器接下来就会调用Servlet来处理请求了(会将之前生成的.java文件进行编译、然后实例化、初始化、调用相应的方法处理请求)
- step3:隐含对象
1)所谓隐含对象(共9个,详细见JSP总结),指的是在.jsp文件里面直接可以使用的对象,比如out、request、response、session、application(ServletContext上下文)等。
2)之所以能直接使用这些对象,是因为容器会自动添加创建这些对象的代码(JSP仅仅是个草稿,最终会变为一个Servlet)。
指令
1)指令是什么
通知容器,在将.jsp文件转换成.java文件时,作一些额外的处理,比如导包。
2)指令的语法
<%@指令名称 属性名=属性值 %>
3)page指令(更多属性,见JSP笔记)
①import属性:导包
例如:
<%@page import="java.util.*"%><!-- 注意:没有分号!-->
<%@page import="java.util.*,java.text.*"%><!-- 多个包以逗号隔开!都在一个双引号里-->
页面显示系统时间
current time:<% out.println(new Date()); %><br />
current time:<%=new Date() %>
注意事项:两个是等价,new Date()会被放入out.print();里
②contenType属性:设置response.setContentType的内容
例如:
<%@page import="java.util.*" contentType="text/html;charset=utf-8" %><!-- 属性之间用空格隔开 -->
③pageEncoding属性:告诉容器.jsp的文件的编码格式,这样,容器杂在获取jsp文件的内容(即解码)时,不会出现乱码。最好加入,有些容器默认以ISO 8859-1编码。
例如:
<%@page contentType="text/html;charset=utf-8" pageEncoding="utf-8" %>
注意事项:页面最好添加:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
,会影响到CSS样式,甚至JS。如IE有个混杂模式,即自动降级,为了兼容老的页面。
4)include指令
对于页面的公共部分,我们可以使用相同的jsp文件,并使用include指令导入,如此实现代码的优化。
告诉容器,在将.jsp文件转换成.java文件时,在指令所在的位置插入相应的文件的“内容“。插入的页面并未运行,而是机械的将内容插入。
例如:
<%@include file="head.jsp" %>