注解
注释:
显式注释:浏览器可以看到的注释,可以给用户看的注释
继承html的注释:<!-- -->
<!-- 继承html的注释 -->
隐式注释:浏览器无法看到的注释,不给用户看的
继承java风格的注释:// /* */
JSP特有的注释:<%-- --%>
<%-- JSP特有的注释 --%>
scriptlet脚本小程序
第一种:(<% %>)
java脚本段,可以定义局部变量、编写语句,通过jsp引擎翻译后其实就是写在了_jspServlet()方法体中
例如:
<%
int a = 0;
int b = 1;
System.out.println(a+b);
response.getWriter().write(""+(a+b));
out.write(""+(a+b));
%>
第二种:(<%! %>)
声明,可以定义全局(成员)变量、方法、类,通过jsp引擎翻译后,写在了里面
例如:
<%!
int c = 8;
%>
第三种:(<%= %>)
表达式,数据、一个变量或具体内容
就相当于 <% out.write("内容"); %> 的缩写
例如:
<%="hellojsp" %>
指令标签
格式:
<%@ 指令标签名称 属性1=值1 属性2=值2 %>
1. Page指令标签
格式:<%@ page 属性1=值1 属性2=值2 %>
属性:
language:指定当前jsp所使用的语言,目前只有java
contentType:指定响应类型,指定编码字符集
pageEncoding:指定编码字符集,优先级:charser>pageEncoding>默认ISO-8859-1
import:导包
errorPage:指定当前页面报错时跳转的错误页面,需要在错误页面打印错误信息 exception 需要设置 isErrorPage="true" 指定所有页面报错跳转,通过配置web.xml 如下;
<error-page>
<error-code>500</error-code><!-- 设置错误码 -->
<location>/error.jsp</location><!-- 指定错误页面路径 -->
</error-page>
2. include指令标签(静态包含)
为什么要用?
因为有些页面有相同部分,相同的内容直接提取出来生成单独的页面,每次要使用的时候只需要包含即可而且当 要修改相同部分内容的时候,只需要修改提取出来的文件即可
格式:
<%@ include file="要包含的路径" %>
为什么不能声明相同的变量?
就相当于将包含页面的内容复制黏贴到了标签所在位置,经过JSP引擎翻译后只生成一个文件
优缺点:
运行效率高一点点。耦合性较高,不够灵活
动作标签
1. include动作标签(动态包含)
格式:
<jsp:include page="指定动态包含页面的路径"></jsp:include>
注意:
注意:通过JSP引擎翻译后生成多个文件,相当于方法的调用,所以和静态包含不一样,不会发生变量冲突除非 要通过子标签来传递参数,否则不要在标签内部加任何内容包括空格
2. forward请求转发
格式:
<jsp:forward page="请求转发的路径"></jsp:forward>相当于
request.getRequestDispatch("请求转发的路径").forward(request,response)
JSP四大域对象
1. pagecontext
2. request
3. session
4. application
往四大域对象中存数据
pageContext.setAttribute("uname", "zhangsan");
request.setAttribute("uname", "lisi");
session.setAttribute("uname", "wangwu");
application.setAttribute("uname", "zhaoliu");
从四大域对象中取数据
pageContext中:<%=pageContext.getAttribute("uname") %><br> <!-- null -->
request中:<%=request.getAttribute("uname") %><br>
session中:<%=session.getAttribute("uname") %><br>
application中:<%=application.getAttribute("uname") %><br>
设置属性:
<%
pageContext.setAttribute("uname", "xiaohong");/* 当前页面有效 */
request.setAttribute("uname", "xiaobai");/* 一次请求有效 */
pageContext.setAttribute("uname", "xiaohei", pageContext.SESSION_SCOPE);/* 通过 pageContext往session中存数据 */
pageContext.setAttribute("uname", "dahong", pageContext.APPLICATION_SCOPE);/* 通过 pageContext往application中存数据 */
%>
获取属性:
pageContext中的uname:<%=pageContext.getAttribute("uname") %>
request中的uname:<%=request.getAttribute("uname") %>
useBean
格式:
<jsp:useBean id="对象的别名" scope="设定对象存储在哪一个域对象" class="类的全限定名"> </jsp:useBean>
<!--
相当于已经new了一个对象
if(user == null){
user = new 类名();
}
-->
jsp:setProperty:给对象设置属性
<jsp:setProperty property="属性名" name="对象的别名" value="属性值"/>
jsp:getProperty:获取对象中的属性值
<jsp:getProperty property="属性名" name="对象的别名"/>
el表达式
格式
${域对象中键的名称} → 将返回域对象响应的值
获取域对象中对象指定属性对应的值:
${域对象中键的名称.属性名 }
判断域对象中指定键对应的值是否为空:
${empty 键的名称 }
判断域对象中指定键对应的值是否相等:
${键1==键2 }
注意:
从小到大获取域对象中的数据,如果都没有则显示"",
获取指定域对象中的数据:${域对象名称Scope.uname }
1. pageContext中: ${pageScope.uname}
2. request中:${requestScope.uname }
3. session中:${sessionScope.uname }
4. application中:${applicationScope.uname }
el表达式获取List数据:
<%
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
request.setAttribute("list", list);
%>
获取list中指定数据:${list[1] }<br>
判断是否为空: ${empty list[3] }<br>
el表达式获取map数据:
<%
Map<String,String> map = new HashMap<String,String>();
map.put("a","1");
map.put("b","2");
map.put("c","1");
request.setAttribute("map", map);
%>
${map["a"] }
${map.a }
el表达式运算:
<%
request.setAttribute("a", "1");
request.setAttribute("b", 1);
request.setAttribute("c", 2);
request.setAttribute("d", "1");
%>
加法:${a+c }<br>
判断是否相等:1${a==d }