一、JSP中编写Java代码:
1.在JSP文件第1行加入,允许执行Java代码:
<!-- language指定允许运行Java代码,errorPage表示当前页面出错时跳到此页面 -->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage="error.jsp"%>
2.将Java代码写在<% %>中:
(1)一段代码:
<%
//在此处编写 java代码
String str = new String("123");
%>
(2)条件代码:
<!-- 将html内容分开写在不同条件中 -->
<% if (true) { %>
html内容1
<% } else { %>
html内容2
<% } %>
(3)脚本表达式,输出到网页上:
<%=new java.util.Date().toLocaleString()%>
二、JSP九大内置对象:
1.直接引用内置对象:
<!-- 九大内置对像 -->
<%
HttpServletRequest req = request; //1.HttpServletRequest内置对象
HttpServletResponse resp = response; //2.HttpServletResponse内置对像
ServletConfig sc = config; //3.ServletConfig内置对像
ServletContext context = application; //4.ServletContext内置对像
HttpSession s = session; //5.HttpSession内置对像
JspWriter os = out; //6.OutputStream内置对像
Object p = page; //7.当前jsp页面本身对象
PageContext context2 = pageContext; //8.通过pageContext可以得到上面所有对象
//9.exception 异常对象,需要JSP设置isErrorPage=true才可以使用
%>
2.方法使用举例:
<!-- 举例 -->
<%
pageContext.forward("index.html"); //跳转到新页面
pageContext.include("index.html"); //将新页面包含在本页显示
pageContext.findAttribute("key1"); //查找其他域中的属性值,查找顺序pageContext-request-session-application
pageContext.getAttribute("key1", pageContext.SESSION_SCOPE); //从指定域找出该属性值
out.write("html内容");//先写入缓存再输出
out.flush();//将缓存内容输出到网页
response.getWriter().write("html内容");//直接输出的
//要设置下载头字段:
response.setHeader("Content-disposition","attachment;filename=文件名");
response.setContentType("application/octet-stream");
%>
三、JSP四大域:
application:所有浏览器共享
session:被当前会话内共享
request:被当前一次请求共享
page:被当前页面共享
四、JSP语法:
1.JSP声明:
<%!内容%> //想在jspService方法外面写个方法就要写在这里面
声明中的内容可以为:方法,变量,静态代码块等等
例:
<%!
//在此处写Java代码,此处定义了一个变量
String str;
%>
2.JSP注释:
<%-- 注释,这种注释不会出现在翻译后的servlet中 --%>
3.JSP指令:
(1)说明:
<%@指令 属性名="值" %>
属性名="值":
java="语言名"
extends="父类名"
import="包名1,包名2..."
session="true或false" 为true时可以用session对象,否则不能
buffer="none | 8kb | sizekb"
autoFlush="trie | false"
isThreadSafe="true | false" 为true时让类自动
info="text"
errorPage="处理错误页面的URL地址" 设置错误处理,这里设了,web.xml中的设置无效
isErrorPage="true" 声明这是个处理错误的页面
contentType="text/html;charset=utf-8" 设置输出内容编码格式,这里设了,
pageEncoding="characterset | ISO"
示例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 导入jar包 -->
<%@page import="java.util.Map"%>
4.在web.xml文件中写代码处理错误:
<error-page>
<exception-type></exception-type>或者<erro-code></erro-code>
<location>处理错误的页面</location>
</error-page>
五、include指令:
包含与被包文件了除了pageEncoding与import以外,其他指令要相同
1.静态包含:
<!-- 静态包含,将被包含页.jsp和当前页合成一个页面,翻译成一个servlet文件 -->
<%@include file="/被包含页.jsp"%>
2.动态包含:
<%
//动态包含,两页面合成一个页面,但是翻译成两个servlet文件
pageContext.include("/被包含页.jsp");
%>
六、JSP标签:
Action(动作)元素,采用jsp:为前坠:
1.jsp:include,动态包含:
<jsp:include page="被包含页.jsp" flush="true" />
2.jsp:forward,跳转到新页面:
<jsp:forward page="新页面.jsp" />
3.jsp:param,嵌在jsp:forward标签中使用,用于转发跳转时,带参数到新页面:
<!-- 转发跳转,newPage.jsp为新页面,并带参数 -->
<jsp:forward page="新页面.jsp" >
<jsp:param value="参数值" name="参数名"/>
</jsp:forward>
4.JSP中使用JavaBean:
(1)创建对象:
<!-- 创建对象,如果域中没有指定的类,就实例化类,再运行标签体内容,否则就不运行 -->
<jsp:useBean id="userInfo" class="com.yyh.hkw.domain.UserInfo" scope="request" />
(2)给对象属性赋值(调用set方法):
方式1:
<!-- 赋值,name参数为对象引用,property为属性名,value为属性值,如果属性类型是基本数据类型以外,就要用脚本表达式或EL表达式进行赋值 -->
<jsp:setProperty name="userInfo" property="name" value="王先生" />
方式2:
<!-- 传参 -->
<%
request.setAttribute("key1", "刘先生");
%>
<!-- 赋值,name参数为对象引用,property为属性名,param为属性值(从域取key1参数赋给变量 -->
<jsp:setProperty name="userInfo" property="name" param="key1" />
方式3:
<!-- 传参,参数名必须和属性名一样 -->
<%
request.setAttribute("name", "系先生");
%>
<!-- 赋值,name参数为对象引用,property为*,表示给所有属性赋值,request所传参数名必须和属性名一样 -->
<jsp:setProperty name="userInfo" property="*" />
(3)输出对象属性到页面(调用get方法):
<!-- 取值并显示,name参数为对象引用,property为属性名 -->
<jsp:getProperty name="userInfo" property="name" />
七、映射JSP页面:
将JSP页面配置成Servlet一样,可通过URL地址直接访问,web.xml中增加如下代码:
<servlet>
<!-- home为任意名 -->
<servlet-name>home</servlet-name>
<!-- /home.jsp为WebContent目录下的网页 -->
<jsp-file>/home.jsp</jsp-file>
</servlet>
<servlet-mapping>
<!-- home为任意名 -->
<servlet-name>home</servlet-name>
<!-- /home为配置允许URL访问的路径 -->
<url-pattern>/home</url-pattern>
</servlet-mapping>
八、EL表达式:
作用:简化JSP代码,用${}包装代码。
1.EL表达式11大内置对象:
作用域相关对象:
pageScope
requestScope
sessionScope
applicationScope
头信息相关对象:
header
headerValues
参数信息相关对象:
param
paramValues
cookie
全局初始化参数:
initParam
2.用EL表达式取参数值:
(1)对象取值:
<!-- 存值 -->
<%
UserInfo user = new UserInfo();
request.setAttribute("user", user);
%>
<!-- 取值:${对象引用名.属性名} -->
${user.name};
(2)组数或List取值:
<!-- 存值 -->
<%
List list = new ArrayList();
list.add("字符串内容");
request.setAttribute("list", list);
%>
<!-- 取值:${列表引用名[下标数值]} -->
${list[0]};
(3)Map取值:
<!-- 存值 -->
<%
Map<String, String> map = new HashMap<String, String>();
map.put("key", "值");
request.setAttribute("map", map);
%>
<!-- 取值:${Map引用名.key名} -->
${map.key}
<!-- 取值:${Map引用名["key名"] -->
${map["key"]}
九、自定义JSP标签(类似JSTL标签):
包名:javax.servlet.jsp.tagext
方法说明:
setPageContext(); //初始化时调用
doStartTag(); //开始时调用
doAfterBody(); //循环方法,执行标签体后再执行这方法
doEndTag(); //结束时调用
几种实现方式:
方式1:实现Tag接口
方式2:继承TagSupport、BodyTagSupport、SimpleTagSupport类等
1.自定义Java类,继承SimpleTagSupport,实现if语句的功能:
/**
* 自定义JSP标签:继承SimpleTagSupport
*/
public class SimpleTagSupportChild extends SimpleTagSupport {
StringWriter sw = new StringWriter();
/**
* 标签属性值
*/
private boolean test;
public void setTest(boolean test) {
this.test = test;
}
@Override
public void doTag() throws JspException, IOException {
if (test) {//条件表达式为true时,执行if标签内部的内容
getJspBody().invoke(sw);
getJspContext().getOut().println(sw.toString());
}
}
}
2.WEB-INF目录下创建tld文件(创建xml的DTD类型,扩展名为tld),配置自定义标签:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd" >
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<!-- 默认前坠 -->
<short-name>yyh</short-name>
<!-- 自定义url -->
<uri>http://yyh.com/tag</uri>
<tag>
<!-- 标签名 -->
<name>if</name>
<!-- 标签类全名 -->
<tag-class>com.yyh.hkw.tag.SimpleTagSupportChild</tag-class>
<!-- EMPTY类型(设置标签体为空)、JSP类型、scriptless类型 -->
<body-content>scriptless</body-content>
<!-- 标签属性 -->
<attribute>
<name>test</name>
<required>false</required>
<!--设置属性的值是否可以为表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
3.JSP页中使用自定义标签:
(1)导入自定义标签:
<!-- prefix随便命名,uri为自定义标签中配置的uri -->
<%@taglib prefix="yyh" uri="http://yyh.com/tag"%>
(2)使用自定义标签:
<!-- 自定义标签,实现if功能,表达式为true时执行if内部语句 -->
<yyh:if test="${5 > 3}">
if语句内部
</yyh:if>