标签:
JSP实际上就是Servlet,它是由容器翻译成Servlet源文件,再编译,用户看到的是Servlet的响应结果。
Servlet作为Web应用中的控制器组件,JSP技术作为数据显示模板。
<%= 变量或表达式%>
注:其中没有分号。 JSP脚本片段
<%
第一行java代码;
第二行java代码;
...
%>
JSP声明:JSP页面中编写的所有代码,默认是翻译到Servlet的_jspService方法中,而JSP声明中的java代码被翻译到_jspService方法的外面。
<%!
java代码;...
%>
<%-- 注释信息 --%>
或者在<%%>
中使用java规定的注释。<!-- 注释信息 -->
,这个在翻译的Servlet中是有显示的,只是控制显示不显示而已。JSP指令
<%@ 指令 属性名="值" %>
,举例:<%@page import="com.hsx.Student"%>
<!-- 写成多个 -->
<%@page import="com.hsx.Student"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!-- 写成一个 -->
<%@page import="com.hsx.Student" language="java" import="java.util.*" pageEncoding="UTF-8"%>
page指令:用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它的作用都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。
属性:
<error-page>
<!-- 异常类型 -->
<exception-type>java.lang.Throwable</exception-type>
<location>/errors/error.jsp</location>
</error-page>
<error-page>
<!-- 针对响应错误码 -->
<error-code>404</error-code>
<location>/errors/404.jsp</location>
</error-page>
errorPage属性优先于web.xml中配置的错误页面
include指令:
request.getRequestDispatcher("demo1.jsp").include(request, response);
,生成两个单独的.java文件,然后把两个运行的结果包含在一起,下面给出动态引入的图介绍: <%@ include file="被包含组件的绝对URL或者相对URL" %>
其中file属性用于指定被引入文件的路径,路径以”/”开头,表示代表当前web应用。.jspf
(JSP fragments)作为静态引入文件的扩展名。<%@ taglib uri="http://xxx" prefix="s"%>
,比如引入Struts2中的OGNL:<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page pageEncoding="UTF-8" %>
out.println("a<br/>");
response.getWriter().println("b<br/>");
上面的输出的结果是先b再a,如果想先输出a再输出b,可以采用关闭缓存或者out.flush();
使得缓存满。
public class Demo {
public void method(PageContext pageContext) {
ServletRequest request = pageContext.getRequest();
ServletResponse response = pageContext.getResponse();
}
}
pageContext.forward("demo1.jsp");
request.getRequestDispatcher("demo1.jsp").forward(request, response);
<jsp:forward page="demo1.jsp"/>
pageContext.include("demo1.jsp");
request.getRequestDispatcher("demo1.jsp").include(request, response);
<%@ include file="demo1.jsp"%> //只有这一种才是静态包含
<jsp:include page="demo1.jsp"></jsp:include>
// 针对page范围的域对象绑定、获取、删除
public void setAttribute(java.lang.String name, java.lang.Object value);
public java.lang.Object getAttribute(java.lang.String name);
public void removeAttribute(java.lang.String name);
// pageContext对象中还封装了访问其他域的方法
public void setAttribute(java.lang.String name, java.lang.Object value, int scope);
public java.lang.Object getAttribute(java.lang.String name, int scope);
public void removeAttribute(java.lang.String name, int scope);
// 代表各个域的常量
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE
// 依次从page、request、session、application范围内获取搜寻指定的参数
findAttribute()
图片下载必须使用到字节流,但是JSP页面有内置对象out,out又可以看成PrintWriter,其实字符流,而在Servlet中不允许同时存在字节流和字符流,则需要把JSP页面调用的out内置对象的所有行删除,注意一个空行或者一个空格都调用了out内置对象。
<%@page import="java.io.OutputStream"%><%@page import="java.io.FileInputStream"%><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%
String realPath = application.getRealPath("/img/p1.jpg");
FileInputStream fis = new FileInputStream(realPath);
OutputStream os = response.getOutputStream();
//通知客户端的下载的方式
response.setHeader("Content-Disposition", "attachment;filename=p1.jpg");
byte[] buffer = new byte[1024];
int len = -1;
while ((len = fis.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
fis.close();
%>
JSP标签页称为JSP Action(JSP动作)元素,它用于在JSP页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成JSP页面难以维护。常用的JSP标签:
<jsp:include>
标签:用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,这种在JSP页面执行时的引入方式称之为动态引入。语法:<jsp:include page="relativeURL | <%=expression%>" flush="true|false"/>
<jsp:forward>
标签:用于把请求转发给另外资源。语法:<jsp:forword page="relativeURL | <%=expression%>"/>
<jsp:param>
标签:当使用<jsp:include>
和<jsp:forward>
标签引入或将请求转发给其他资源时,可以使用<jsp:param>
标签向这个资源传递参数。由于JSP实际上就是一个Servlet,那么可以像配置Servlet映射那样配置来映射JSP。
<servlet>
<servlet-name>HelloWorld</servlet-name>
<jsp-file>/demo1.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/demo1.html</url-pattern>
</servlet-mapping>
根据页面的信息,找到对应已经翻译成的Servlet,查看错误的原因。
JavaBean是一个遵循特定写法的Java类,它通常有以下特点:
- 这个Java类必须具有一个无参的构造方法。
- 字段必须私有化。
- 私有化的字段必须通过public类型的方法[getter/setter]暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。
- 实现Serialiazable接口,便于序列化和反序列化。
JavaBean在JavaEE开发中,通常用于封装数据,对于遵循以上写法的JavaBean组件,其它程序可以通过反射技术实例化JavaBean对象,并且通过反射那些遵循命名规范的方法,从而获知JavaBean的属性,进而调用其属性保存数据。
- 封装对象
- 表示实际业务的某些名词(实际/抽象)。
JSP技术提供了三个关于JavaBean组件的动作元素 [内置JSP标签],分别是:
<jsp:useBean>
标签:用于在JSP页面中的域范围内查找或实例化一个JavaBean对象。 <jsp:useBean id="beanName" class="package.class" scope="page | request | session | application"><jsp:useBean>
<jsp:setProperty>
标签:用于在JSP页面中设置一个JavaBean对象的属性,前提Bean存在。<jsp:getProperty>
标签:用于在JSP页面中获取一个JavaBean对象的属性,前提Bean存在。<jsp:useBean id="hh" class="com.hsx.Student" scope="page"></jsp:useBean>
<%=hh.getName() %>
<%=hh.getId() %>
<jsp:setProperty property="id" name="hh" value="23"/>
<jsp:setProperty property="name" name="hh" value="皇后搜寻"/>
<jsp:getProperty property="id" name="hh"/>
<jsp:getProperty property="name" name="hh"/>
<%=hh.getName() %>
<%=hh.getId() %>
<jsp:setProperty property="id" name="hh" param="id"/>
<jsp:setProperty property="name" name="hh" param="id"/>
<jsp:setProperty property="*" name="hh"/>
<jsp:useBean id="s" class="com.hsx.Student" scope="page"></jsp:useBean>
${s.name }
<br/>
<jsp:getProperty property="name" name="s"/>
<br/>
<%
Object o = pageContext.findAttribute("s");
Student student = (Student) o;
out.println(student.getName());
%>
<br/>
${o }
上面的代码${o }
中的o没有存放在域中,那么在浏览器上显示的是”“.。
${user.address.city}
,${user.list[0]
},${map.key}
]<%
Student student = new Student();
student.setName("你好");
Address address = new Address();
address.setProvince("安徽");
address.setCity("黄山");
student.setAddress(address);
request.setAttribute("student", student);
%>
${student.name }
${student.address.city }
<hr/>
<%
List<String> list = new ArrayList<String>();
list.add("11");
list.add("22");
request.setAttribute("list", list);
%>
${list[1] }
<hr/>
<%
Map<String, String> map = new HashMap<String, String>();
map.put("one", "111");
map.put("two", "222");
request.setAttribute("map", map);
%>
${map.one }
结合JSTL的foreach标签,使用EL表达式也可以很轻松迭代各种类型的数组或集合[迭代数组、迭代colleation类型集合、迭代map类型集合]
empty运算符:检查对象是否为null或空,当对象不存在null或空字符串或空集合或空数组,${empty xx }
都打印true
<%
Student s = new Student();
request.setAttribute("s", s);
%>
${empty s }
${user != null ? user.name : "" }
${student.gender == 1 ? "男" : "女"}
${隐式对象名称 }
获取对象的引用。 http://localhost:8080/jsp/el.jsp?username=hsx
,${param.username}
http://localhost:8080/jsp/el.jsp?username=hsx&username=hhh
,${paramValues.username[0]}
${header.accept }
,当其中的请求头中有-隔开的请求头,那么${header["Accept-language"]}
EL表达式语法允许开发人员开发自定义函数,以调用Java类的方法。
//-------------编写一个Java类的静态方法--------------------------
public class Small2Big {
public static String toUpperCase(String value) {
return value.toUpperCase();
}
}
//--------编写标签库描述(tld)文件,在tld文件中描述自定义函数(放在工程下的WEB-INF目录下)--------
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<jspversion>1.1</jspversion>
<description>myfun</description>
<short-name>hsx</short-name>
<uri>http://www.hsx.com/jsp/jstl/myfun</uri>
<function>
<description>toUpperCase</description>
<name>toUpperCase</name>
<function-class>com.hsx.Small2Big</function-class>
<function-signature>java.lang.String toUpperCase(java.lang.String)</function-signature>
<example><hsx:toUpperCase(‘aaa‘)</example>
</function>
</taglib>
//-----------在JSP页面中导入和使用自定义函数----------
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="hsx" uri="http://www.hsx.com/jsp/jstl/myfun" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
${hsx:toUpperCase(‘aaa‘) }
</body>
</html>
在JSP页面中加上<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
元素导入标签库。
<!-- list -->
<%
List<Student> list = new ArrayList<Student>();
list.add(new Student(1, "aaa"));
list.add(new Student(2, "bbb"));
list.add(new Student(3, "ccc"));
list.add(new Student(4, "ddd"));
list.add(new Student(5, "eee"));
request.setAttribute("list", list); //存放在request域中
%>
<table border="1" width="50%">
<tr>
<th>序号</th>
<td>ID</td>
<td>NAME</td>
</tr>
<c:forEach items="${list }" var="student" varStatus="s">
<tr style="background-color: ${s.count % 2 == 0 ? ‘red‘ : ‘yellow‘ }">
<td>${s.count }</td>
<td>${student.id }</td>
<td>${student.name }</td>
</tr>
</c:forEach>
</table>
<hr/>
<!-- map -->
<%
Map<String, Student> map = new HashMap<String, Student>();
map.put("a", new Student(1, "aaa"));
map.put("b", new Student(2, "bbb"));
map.put("c", new Student(3, "ccc"));
map.put("d", new Student(4, "ddd"));
map.put("e", new Student(5, "eee"));
request.setAttribute("map", map);
%>
<c:forEach items="${map }" var="st">
${st.key }=${st.value.name }:${student.value.id }
</c:forEach>
<hr/>
<!-- if -->
<%
session.setAttribute("stud", new Student(1, "hsx"));
%>
<c:if test="${sessionScope.stud == null }">
<input type="text" name=""/>登录
</c:if>
<c:if test="${sessionScope.stud != null }">
欢饮您!${sessionScope.stud.name }
</c:if>
标签:
原文地址:http://blog.csdn.net/hsx1612727380/article/details/51242398