JSP和JavaBean
JSP
JSP全名为Java Server Pages,即java服务器页面,其根本是一个简化的Servlet设计。它是在传统的网页HTML文件中插入Java代码,从而形成JSP文件。
JSP注释分为显式(客户端可以看见)和隐式注释(不可见)。
显式: <!-- -->
隐式: // 、 /**/ 、 <%-- --%>
JSP编译指令
page
定义一个jsp页面的相关属性。<%@page 属性=“内容”%>常用import、pageEncoding、errorPage/isErrorPage
以下是会产生异常的页面的配置:
<%@pagelanguage="java" import="java.util.*" errorPage="error.jsp" isErrorPage="false" %>
exception的实例代表其他页面的异常和错误。只有当页面是错误处理页面时,即isErrorPage为true时,该对象才可以使用。
errorPage的实质就是JSP的异常处理机制,发生异常时才会跳转到errorPage指定的页面,没必要给errorPage再设置一个errorPage。所以当errorPage属性存在时,isErrorPage属性值为false。
含有isErrorPage属性表示当前页面是处理异常的页面,不是会产生异常的页面。
include
静态包含:<%@ include file=”” %>
静态包含中实际上是将所包含的文件内容导入目标页面,然后再一起进行编译,最后再将一份整体的内容展现给用户,属于先包含,后编译。
动态包含:<jsp:include page=””>
动态包含语句可以自动区分被包含的页面是静态还是动态。如果是静态页面,则与静态包含一样,将内容包含进来处理,如果是动态页面,可以先进行动态地处理,然后再将处理后的结果包含进来。
taglib
用于定义和访问自定义标签
JSP内置对象
pageContext |
JSP页面容器 |
request |
得到用户的请求信息 |
response |
服务器向客户端的回应信息 |
session |
保存每一个用户的信息 |
application |
所有用户的共享信息 |
config |
服务器配置,可以获得初始化参数 |
out |
页面输出 |
page |
从页面中表示出来的一个Servlet实例 |
exception |
JSP页面所发生的异常,在错误页面中起作用 |
|
|
4种属性范围
page:只在一个页面中保存属性,跳转之后无效。
request:在一次请求中保存属性,服务器跳转后仍然有效。
session:在一次回话范围中保存,无论何种跳转都可以使用,但是新开浏览器失效。
application:在整个服务器上保存,所有用户都可以使用。
操作属性的方法如下:
public void setAttribute(String name ,Object value)
public Object getAttribute(String name)
public void removeAttribute(String name)
request对象
接收客户端发送而来的请求信息。
request是javax.servlet.http.HttpServletRequest接口的实例化对象,HttpServlet是ServletRequest的子接口。
常用方法:
public String getParameter(String name)
public String[] getParameterValues(String name)
public Httpsession getSession()
//获得上下文资源路径
public String getContextPath()
//解决乱码
request.setCharacterEncoding(“utf-8”)
response对象
对客户端的请求进行回应,将Web服务器处理后的结果发回给客户端。
response是javax.servlet.http.HttpServletResponse接口的实例化对象,HttpServlet是ServletResponse的子接口。
常用方法
//重定向
public void sendRedirect(String location) throws IOException
Session对象
session最主要的用处是完成用户的登录,注销等常见功能,每一个Session对象都表示不同的访问用户,session对象是javax.servlet.http.HttpSession接口的实例化对象,所以session只能应用在HTTP协议中。
常用方法:
public String getId()
//让session失效
public void invalidate()
application对象
application对象是javax.servlet.ServletContext接口的实例化对象。
常用方法:
//得到虚拟目录对应的绝对路径
String getRealPath(String Path)
config对象
Web目录中必须存在一个WEB-INF文件夹,该文件夹无法被外部所看见,安全性最高。因为WEB-INF中的文件太安全,外面永远无法访问,可以通过一个映射进行操作。
例如将index.jsp放在WEB-INF目录中,外部将无法访问到,则需要在web.xml文件中进行配置
<servlet>
<servlet-name>hello</servlet-name>
<jsp-file>/WEB-INF/index.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
上面配置表示,将/WEB-INF/index.jsp的文件映射成为一个/hello的访问路径,程序会自动根据<servlet-mapping>节点中配置的<servlet-name>找到对应的<servlet>节点,并找到<jsp-file>所指定的真是文件路径以执行程序。
config对象是javax.servlet.ServletConfig接口的实例化对象,主要功能是取得一些初始化的配置信息。
常用方法:
public String getInitParameter(String name)
在<servlet>中的配置
<init-param>
<param-name></param-name>
<param-value></param-value>
</init-param>
pageContext对象
pageConext对象是javax.servlet.jsp.PageContext类的实例,主要表示一个页面的上下文。
之前的request、response、config、application、<jsp:include>和<jsp:forward>等操作实际上都可以在pageContext对象中完成。
JSP动作指令
jsp:forward |
执行页面转向,将请求的处理转发到下一个页面 |
jsp:param |
用于传递参数,必须与其他支持参数标签一起使用 |
jsp:include |
动态引入一个JSP页面 |
jsp:plugin |
下载JavaBean或Applet到客户端执行 |
jsp:useBean |
使用JavaBean |
jsp:setProperty |
修改JavaBean实例的属性值 |
jsp:getProperty |
获取JavaBean实例的属性值 |
include
1、静态包含
指令<%@include file = “abc.jsp” %>
(1)两个jsp页面的<%@page contentType=“text/html;charset=”utf-8” %>应该保持一致。不能向被包含的jsp页面传递参数。
(2)包含的jsp页面与被包含的jsp页面共用一个request内置对象。
(3)将两个jsp文件合二为一,生成一个以包含页面命名的Servlet和class文件。
(4)静态include纯粹是把代码写在外面的一种共享方法,所有的变量都是可以和include它的主文件共享,两者高度紧密结合,不能有变量同名的冲突.而页面设置也可以借用主文件的。
(5)用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面,直接将内容先包含后处理。
2、动态包含
<jsp:include page=“abc.jsp”/>
(1)动态包含将两个jsp文件各自生成自己的Servlet和class文件。
(2)动态包含只有在执行到它的时候才加载,所以才叫动态包含。
(3)动态include的结构是两者独立,直到输出时才合并。
转发和重定向
转发(forward)
静态
request.getRequestDispatcher(“main.jsp”).forward(request,response);
动态
<jsp:forward page=“main.jsp”>
转发方法的调用者与被调用者之间共享相同的request 对象和response 对象,它们属于同一个访问请求和响应过程。转发到的页面能获取数据。
RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;
调用RequestDispatcher.forward方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
重定向(redirect)
HttpServletResponse.sendRedirect(“main.jsp”);
重定向方法调用者与被调用者使用各自的request 对象和response 对象,它们属于两个独立的访问请求和响应过程。重定向后的页面不能获取原请求存放的数据。
HttpServletResponse.sendRedirect方法不仅可以重定向到当前应用程序中的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL。
区别
jsp:forward动作执行的是强制性跳转,写在其后面的语句不会执行。而sendRedirect()方法跳转至页面后,还会执行后面的代码;
jsp:forward动作是将page的值指定的页面直接送给IE。sendRedirect()方法是告诉IE要跳转页面,IE再自动调用其参数指定值的页面,其间经过三趟通讯;
|
转发 |
重定向 |
代码 |
RequestDispatcher.forward <jsp:forward page=“main.jsp”> |
HttpServletResponse.sendRedirect |
url |
url地址不会改变 |
初始的URL地址变成重定向的目标URL。 |
数据 |
转发到的页面能获取数据。 |
重定向后的页面不能获取原请求存放的数据。 |
请求 |
不会发送新的请求 |
发送了新的请求 |
后边语句 |
不会执行 |
会执行后面的代码 |
JSP和Servlet区别
联系:
JSP是Servlet发展后期的产物,Servlet利用输出流动态生成整个HTML,开发效率低下。JSP是在HTML中插入java代码形成。
主要用JSP来动态生成HTML文件,然后返回客户端显示。Servlet需要将整个页面作为结果返回时,通过调用jsp文件来实现。
区别:
(1)JSP是动态网页开发技术,是运行在服务器端的脚本语言,而Servlet是web服务器端程序技术。访问一个JSP页面时,服务器会将这个JSP编译后就变成了“类Servlet”(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP代码);
(2)JSP擅长表现于页面显示,Servlet更擅长于逻辑控制;
(3)Servlet中没有内置对象,JSP中的内置对象都是通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到;
(4)JSP修改后可以立即看到结果,不需要编译;Servlet需要编译;
(5)在标准的MVC架构中,Servlet作为Controller接受用户请求并转发给相应的Action处理,JSP作为View主要用来产生动态页面。
JavaBean
JavaBean是使用Java语言开发的一个可重用的组件,在JSP开发中可以使用JavaBean减少重复代码,使整个JSP代码的开发更简洁。
JavaBean满足的条件是:
①所有的类必须放在一个包中,web中没有包的类是不存在的。
②所有的类必须声明为public class,这样才能外部类访问。
③类中所有的属性都必须封装,使用private声明。提供相应的setter,getter方法
④至少存在一个无参构造方法。
web开发的标准目录结构
目录或文件名 |
作用 |
WEB ROOT |
Web的根目录,一般虚拟目录直接指向此文件夹 |
WEB-INF |
Web目录中最安全的文件夹,保存各种类、第三方jar包、配置文件 |
web.xml |
Web的部署描述符 |
classes |
保存所有的JavaBean,如果不存在,可以手工创建 |
lib |
保存所有的第三方jar文件 |
tags |
保存所有的标签文件 |
jsp |
存放*.jsp文件,一般根据功能创建子文件夹 |
css |
样式表文件的保存路径 |
images |
存放所有的图片 |
<jsp:useBean>指令
与import语句一样,导入所需要的JavaBean
<jsp:useBean id=”实例化对象名” scope=”保存范围” class=”包.类名称”>
<jsp:setProperty>
设置属性
<jsp:setProperty name=”实例化对象名” property=”属性名称” value=”内容”>