第一个JSP页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" Content="text/html"; charset="UTF-8">
<title></title>
</head>
<body>
<h1>hello world</h1>
</body>
</html>
注释
在 JSP 中支持两种注释的语法操作,一种是显示注释,这种注释是允许客户端看见的;另一种是隐 式注释,此种注释是客户端无法看见的
① 显示注释语法:从 HTML 风格继承而来
② 隐式注释语法:从 JAVA 风格继承;JSP 自己的注释
JSP 的三种注释方式:
1)// 注释,单行注释 /* 多行注释 */
2)
3)<%-- JSP 注释 --%>
scriptlet
<!-- jsp中无法直接写java代码,会当做原样字符输出 -->
<%--写java代码,必须使用scriptlet,在jsp中一共有三种scriptlet代码
第一种:<% %> :java 脚本段,可以定义局部变量、编写语句
第二种:<%! %>:声明,可以定义全局(成员)变量、方法、类
第三种:<%= %>:表达式,数据、一个变量或具体内容
--%>
<%
int a=2;
int b=3;
System.out.println(a+b);
out.write(""+(a+b));
//采用response.getWriter()输出的字符,会一直在左上角,故一般不使用该方法输出字符,而是用out,进行输出
response.getWriter().write("we"+(a+b));
out.write(""+(a+b));
%>
<%!
int a = 3;
%>
<!-- <%=%> 有out.write的效果-->
<%="hello"%>
jsp的指令标签
page指令标签
<!-- page指令标签
格式:
< %@ page 属性1=值1 属性2=值2 % >
属性:
language:指定当前jsp所使用的语言,目前就只有java
contentType:指定响应类型;指定编码字符集
pageEncoding:指定编码字符集 优先级,charset=UTF-8 > pageEncoding="UTF-8" > 默认ISO-8859-1
import:导包
errorPage:指定当前页面报错跳转的错误页面,需要在错误页面打印错误信息 exception 需要设置 isErrorPage="true"
指定所有页面报错跳转,通过配置web.xml 设置<error-page>
-->
<%@ page errorPage="error.jsp" %>//errorPage格式,语法错误不会跳转页面
//error页面
<%@ page isErrorPage="true" language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" Content="text/html"; charset="UTF-8">
<title></title>
</head>
<body>
<h2>大家好,我是error页面</h2>
<%=exception%><!--返回错误信息 -->
</body>
</html>
1,include
include 动作用于动态地包含另一个资源,它可以包含另一个 JSP 页面、一个 Servlet 或者一个静态 的 HTML 页面。
为什么要使用包含?
因为有些页面有相同的部分,相同的内容直接提取出来生成单独的文件,
每次要使用的时候,只需要包含即可,而且当要修改相同部分内容的时候,只需要修改提取出来的文件即可。
静态包含、动态包含
静态包含:
格式:<%@ include file="要包含的页面路径" %>
注意:就相当于将包含页面的内容复制黏贴到了标签所在位置,经过JSP引擎翻译后只生成一个文件
所以不能声明相同的变量
运行效率高一点点。耦合性较高,不够灵活
//include1
<h1>我是包含页面</h1>
<%@include file="/include2.jsp" %>
<%int a=3; %><!--两边不能定义同样的变量 -->
<%=1/0 %>//测试错误页面,应删除
//include2
<h1>我是被包含的页面</h1><!--两边的内容会放在一起-->
<%int a=2; %>
<%=a %>
动态包含:
<jsp:include page="include.jsp"></jsp:include>//格式
动态包含:
格式:
<jsp:include page="指定动态包含页面的路径"></jsp:include>
注意:通过JSP引擎翻译后生成多个文件,相当于方法的调用,所以和静态包含不一样,不会发生变量冲突。
除非要通过子标签来传递参数,否则不要在标签内部加任何内容包括空格
//include3
<h1>我是包含页面</h1>
<jsp:include page="include4.jsp"></jsp:include><!-- 动态包含 -->
<%int a=3; %><!--两边可以定义同样的变量 -->
<%=a %>
//include4
<h1>我是被包含的页面</h1><!--两边的内容会放在一起-->
<%int a=2; %>
<%=a %>
forward
forward 动作用于请求转发,可以将一个用户的请求(request),从一个页面传递到另一个页面,跳 转的语法:
<!-- 不传参数 -->
<jsp:forward page="要转到的资源路径|<%=表达式%>"></jsp:forward>
<!-- 传参数 -->
<jsp:forward page="要转到的资源路径|<%=表达式%>">
<jsp:param value="参数内容" name="参数名称"/>
</jsp:forward>
jsp 的 forward 动作标签,其作用的理解可以等价于 Servlet 域对象 HttpServletRequest 的请求转 发,即 request.getRequestDispatcher(“要转到的资源路径”).forward(request, response);
//forward1
<%
pageContext.setAttribute("uname","xiaohong");//当前页面有效
request.setAttribute("uname","xioaming");//一次请求有效
pageContext.setAttribute("uname","xiaohei",pageContext.SESSION_SCOPE);
//通过pageContext往session中存数据
pageContext.setAttribute("uname", "dabai", pageContext.APPLICATION_SCOPE);
//通过pageContext往application中存数据
%>
pageContext中的uname:<%=pageContext.getAttribute("uname") %><br/>
request中的uname:<%=request.getAttribute("uname") %>
<jsp:forward page="forward2.jsp">
<jsp:param value="xiaolan" name="uname"/>
</jsp:forward>
//forward2
<h1>我是请求转发后的页面</h1>
<%=request.getParameter("uname") %><br/><!--获取跳转传过来的数据 -->
<!-- JSP四大域对象 -->
pageContext中的uname:<%=pageContext.getAttribute("uname") %><br/>
request中的uname:<%=request.getAttribute("uname") %><br/>
session中的uname:<%=session.getAttribute("uname") %><br/>
application中的uname:<%=application.getAttribute("uname") %>
userBean
jsp:useBean
格式:
<jsp:useBean id="对象的别名" scope="设定对象存储在哪一个域对象中" class="类的全限定名"></jsp:useBean>
<!--
相当于
if(user == null){
user = new User();
}
-->
</jsp:useBean>
jsp:setProperty:给对象设置属性
<jsp:setProperty property="属性名" name="对象的别名" value="属性值">
jsp:getProperty:获取对象中的属性值
<jsp:getProperty property="属性名" name="对象的别名">
//在userbean标签中使用
<jsp:useBean id="user" scope="page" class="com.mage.po.User"></jsp:useBean>
<jsp:setProperty property="name" name="user" value="liuhh"/>
<jsp:getProperty property="name" name="user"/>
<%-- <%=user.getName() %> --%>
jsp的9大内置对象:
EL表达式
EL 表达式一般操作的都是域对象中的数据,操作不了局部变量。域对象的概念在 JSP 中一共有四 个:pageContext, request, session, application;范围依次是,本页面,一次请求,一次会话,整个 应用程序。而 EL 默认的查找方式为从小到大查找,找到即可。当域对象全找完了还未找到则返回空字 符串””。
${requestScope.user.id} // 在 request 作用域中获取 user 对象的 id 属性
<%
List <String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list", list);
%>
${empty list} <!--判断是否为空,为空显示true,放在显示false -->
jsp导包:
<%@ page import="java.util.*"%>//导入所有util包