在传智播客老师的带领下,我们已经学过几天javaweb的课程了,但都是停留在servlet及cookie和session的学习上,仅仅是知识点的讲解不免枯燥乏味,今天我们终于开始揭开jsp的神秘面纱了。
既然前奏学习了很多servlet知识,说明jsp和它还是很有渊源的嘛。在实际运用中,jsp大大提高了程序员开发网页的效率,实质上,jsp在服务器容器中运行时首先会被转译成为java代码(servlet),然后再进行编译成class文件。如图:
在JSP常用的共有三种JSP指令,它们是被设置在<%@和%>括号中插入到HTML网页的。
JSP的标准指令格式:
<%@ 标准指令(与其属性 )%>
<%@ diectivename
attribute=“value”,
attribute=“value”%>
JSP共有三种标准指令
JSP标准指令 |
用途 |
范例 |
@page |
设定JSP整体信息 |
<%@page import=“java.util.*”%> |
@innclude |
在JSP内包含其他JSP内容 |
<%@include file=“leftframe.jsp”%> |
@taglib |
在JSP内使用“自定义标签” |
<%@taglib prefix=“abc”uri=“taglib.tld”%> |
我们最常用的就是@page和@taglib了,通常使用@page指令设置网页的字符集编码,使用@taglib在JSP内使用“自定义标签”。
另外不得不说的就是jsp的内置隐式对象了,在JSP内部有一个隐含对象集合,编写JSP页面中,可以直接调用这些隐含对象中的方法而不必事先要把它实例化。简化了JSP页面的开发。
隐含对象 |
对象类型 |
说明 |
Request |
javax.servlet.http.HttpServlerRequest |
封装了浏览器发出的请求对象,它的作用域是一个完整的请求,这将作为_jspService的入口参数 |
Response |
javax.servlet.http.HttpServlerResponse |
封装响应内容的对象,具有页面的作用域 |
pageContext |
javax.servlet.jsp.PageContext |
PageContext对象给JSP提供当前请求页面的信息,该信息也被称做页面属性,可以通过对该对象获取JSP页面的其他隐含对象 |
Session |
javax.servlet.http.HttpSession |
客户端发送一个请求时,在服务器上将创建一个会话维护这个客户的各种操作,该对象称为session,只要指令标签中没有将会话取消(<%@ page session=”false”%>,就可以使用该对象,通过session对象的setAttribute和getAttribute方法可维护session中的对象。 |
Out |
javax.servlet.jsp.JspWriter |
out对象将响应的信息输出到网页上,其缓冲大小通过page指令标签的buffer属性设置 |
Application |
javax.servlet.ServletContext |
它提供了一组和Web容器通信的方法,每个应用程序都有一个上下文,这意味着Application对象能够在应用程序的整个生命周期访问。 |
Config |
javax.servlet.ServletConfig |
Config对象使用Web容器在初始化JSP之前得到JSP配置信息,config的作用域为页面 |
Page |
java.lang.Object |
page对象对应Java中的关键字this,它代表当前JSP页面 |
Exception |
java.lang.Throwable |
是java.lang.Throwable的一个实例,它代表未扑获的异常,只有在page指令中指定isErrorPage=”true”属性,将JSP页面标识为错误处理页面,才可以使用这个对象 |
说它们是完全隐匿的是不正确的,虽然它们不需要我们去创建就能直接使用它们,是因为服务器容器早就为我们作好了声明,如图:
Jsp中标准动作元素的使用:
课堂小练习:模拟大唐电信不同用户角色登录(<jsp:forward>)
当用户名和密码为空时:
角色用户名或密码错误效果
正确登录效果
这主要使用到了<jsp:forward page=" "><jsp:param value=" " name=""/></jsp:forward>技术,通过<jsp:param value=" " name=""/>可以在页面间传递参数。
loginCheck.jsp源码如下:
<%
String username = request.getParameter("t_user_id");
String password = request.getParameter("t_password");
String depart = request.getParameter("t_role");
if(username != null && !"".equals(username.trim()) && password != null && !"".equals(password.trim())){
if("a".equals(depart.trim())){
if("opt".equals(username.trim()) && "opt".equals(password.trim())){
%>
<jsp:forward page="/operator/index.jsp">
<jsp:param value="操作员" name="t_user_id"/>
</jsp:forward>
<%
}else{
%>
<jsp:forward page="/login/login.jsp">
<jsp:param value="操作员的用户名或密码错误" name="error"/>
</jsp:forward>
<%
}
}else if("b".equals(depart.trim())){
if("manager".equals(username.trim()) && "manager".equals(password.trim())){
%>
<jsp:forward page="/manager/index.jsp">
<jsp:param value="主管" name="t_user_id"/>
</jsp:forward>
<%
}else{
%>
<jsp:forward page="/login/login.jsp">
<jsp:param value="主管的用户名或密码错误" name="error"/>
</jsp:forward>
<%
}
}else if("c".equals(depart.trim())){
if("emp".equals(username.trim()) && "emp".equals(password.trim())){
%>
<jsp:forward page="/employee/index.jsp">
<jsp:param value="普通员工" name="t_user_id"/>
</jsp:forward>
<%
}else{
%>
<jsp:forward page="/login/login.jsp">
<jsp:param value="普通员工的用户名或密码错误" name="error"/>
</jsp:forward>
<%
}
}
}else{
%>
<jsp:forward page="/login/login.jsp">
<jsp:param value="用户名或密码不能为空" name="error"/>
</jsp:forward>
<%
}
%>
在login.jsp页面构造接受loginCheck.jsp验证不通过的错误信息:
<body bgcolor="#000000" id="main">
<%
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String error = request.getParameter("error");
if (error != null) {
out.print("<div id='error'><div style='background:white;border:solid white 20px;color:red;margin-left:40%;margin-top:200px;width:268px;height:80px;font-weight:bolder'><center>"
+ error
+ "!<br /><input type='button' value='确定' onclick='closediv()'/></center></div></div>");
}
%>
并为该div设置css样式以及为“确定”按钮设置动作:
#error {
margin: 0 auto;
width: 100%;
height: 100%;
position: absolute;
left: 0px;
top: 0px;
background: black;
filter: alpha(opacity = 90);
}
</style>
<script type="text/javascript">
function closediv(ob) {
var p = document.getElementById("main");
var d = document.getElementById("error");
p.removeChild(d);
}
</script>