一、JSP的语法有哪些?各指令有什么功用?
1.page指令:page指令用于定义整个JSP页面的相关属性。
page的语法格式如下:
<%@ page attr=”value1” attr2=”value2”...%>
①language属性(目前只支持java语言)
<%@ page language=”java”%>
②extends属性:用于设置JSP页面继承的java类(该属性不常用,而且有可能影响服务器的性能 优化)
③import属性:该属性用于设置JSP导入的类包。
<%@ page import=”java.util.*”%>
④pageEncoding属性:该属性用于定义JSP页面的编码格式,也就是指定文件编码
<%@ page pageEncoding=”UTF-8”%>(如果属性值设置为ISO-8859-1,那么整个JSP页面就不 支持中文字符,通常设置编码格式为GBK或UTF-8)
⑤contentType属性
<%@ page contentType=”text/html; charset=UTF-8”%>
2.include指令:用于文件包含,指该指令可以在JSP页面中包含另一个文件的内容(但仅支持静态包含)。
include的语法格式如下:
<%@ include file=”validate.jsp”%>
3.taglib指令:该指令用于加载用户自定义标签,使用该指令加载后的标签可以直接在JSP页面中使用。
taglib语法格式如下:
<%@ taglib prefix=”fix” uri=”tagUriorDir”%>
①prefix属性:用于设置加载自定义标签的前缀
②uri属性:用于指定自定义标签的描述符文件位置
例如:<%@ taglib prefix=”view” uri=”/WEB-INF/tags/view.tld%>
4.关于include指令的联系。(例5-2,在当前页面中包含另一个JSP文件来显示当前日期。P84)
(1)首先编辑date.jsp文件,程序代码如下:
<%@page pageEncoding="GB18030"%>
<%@page import = "java.util.Date" %>
<%
Date now = new Date();
String dateStr;
dateStr = String.format("%tY年%tm月%td日",now,now,now);
%>
<%=dateStr %>
在esclipe中截图如下:
(2)编辑index.jsp文件,其中使用了include指令包含date.jsp文件到当前页面,程序代码如下:
<%@page language="java" import="java.util.*"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>include指令演示</title>
</head>
<body>
<!-- HTML注释信息 -->
当前日期是:
<%@include file="date.jsp" %>
<br>
</body>
</html>
在esclipe中截图如下:
程序运行结果如下图所示:
注意:被include指令包含的JSP页面中不要使用<html>和<body>标签,它们是HTML的结构标签,被包含进其他JSP页面会破坏页面格式。另外还要注意源文件和被包含文件中的变量和方法的名称不要冲突,因为它们最终会生成一个文件,重名将导致错误发生。
二、关于嵌入Java代码的练习
1.代码片段:在JSP页面中嵌入的Java代码,也可称为脚本段或脚本代码。
其语法格式如下:
<% 编写Java代码 %> (编写单行或多行的Java代码,语句以“;”结尾。)
2.(例5-3 在代码片段中编写循环输出九九乘法表。 P85)
程序代码如下:
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>JSP的代码片段</title>
</head>
<body>
<%
long startTime = System.nanoTime(); //记录开始时间,单位纳秒
%>
输出九九乘法表
<br>
<%
for(int i = 1;i<=9; i++){ //第一层循环
for(int j = 1; j<=i; j++){ //第二层循环
String str = j + "*" + i + "=" + j * i;
out.print(str + " "); //使用空格格式化输出
}
out.println("<br>"); //HTML换行
}
long time = System.nanoTime()-startTime;
%>
生成九九乘法表用时
<%
out.println(time/1000); //输出用时多少毫秒
%>
毫秒。
</body>
</html>
在esclipe中截图如下:
程序运行结果如下图所示:
在练习过程中遇到的问题:
打开esclipe自带的pageEncoding属性指定的文件编码和contentType属性指定的字符编码都是“ISO-8859-1”,运行结果是九九乘法表可以显示,但是中文字符是乱码,如下图:
一开始是照着书上打代码,书上pageEncoding属性指定的文件编码是“GB18030”,于是我把文件编码和字符编码都改成了“GB18030”,程序运行页面是空白,title部分是乱码,运行结果如下图:
我将pageEncoding属性的指定文件编码和contentType属性的字符编码改为“UTF-8”才出现了正确的运行页面,于是我又多看了几遍P83关于pageEncoding属性和contentType属性的知识点,书上说通常设置编码格式为GBK或UTF-8,但是我设置了GBK也会出现乱码(可能是其他地方有问题),所以我觉得保险起见用UTF-8编码更好。
2.JSP表达式
JSP表达式可以直接把Java的表达式结果输出到JSP页面中。表达式的最终运算结果将被转换为字符串类型,因为在网页中显示的文字都是字符串。
JSP表达式的语法格式如下:
<%= 表达式 %>
其中,表达式可以是任何Java语言的完整表达式。
例如,圆周率是:<%= Math.PI %>
关于JSP表达式的内容有点不太理解,看字面意思能懂,但是不知道怎么用,希望在之后的联系中能明白。
3.注释
①HTML注释的语法格式如下:
<!-- 注释文本 -->
②JSP注释的语法格式如下:
<%-- 注释文本 --%>
③动态注释(用HTML和JSP注释的组合构成):
<!-- <%=new Date()%> -->
④代码注释
//单行注释
/* 多行注释 */
三、request对象
1.request对象是javax.servlet.http.HttpServletRequest类型的对象。该对象代表了客户端的请求信息,主要用于接收通过HTTP传送到服务器端的数据(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。
在一个请求中,可以通过使用“?”的方式来传递参数,然后通过request对象的getParameter()方法来获取参数的值。例如:
String id = request.getParameter("id");
如果request对象中不存在此参数,那么该方法将会返回null。
按照P88练习如下:
index.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href = "show.jsp?id=123">获取请求参数的值</a>
</body>
</html>
在esclipe中截图如下:
show.jsp页面代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
id参数的值为:<%=request.getParameter("id") %><br>
name参数的值为:<%=request.getParameter("name") %><br>
age参数的值为:<%=request.getParameter("age") %><br>
grade参数的值为:<%=request.getParameter("grade") %><br>
</body>
</html>
在esclipe中截图如下:
程序运行结果如下图所示:
在练习过程中遇到的问题:
我在show页面设置了很多参数是因为我希望在index.jsp页面中多设置几个参数,就是点击一个链接,可以获得id、name、age等参数,然后grade参数值为null,但是我不知道怎么把这些参数设置在一个链接里,试了几次都不行,截图如下:
2.例5-5,获取Form表单信息。P89
创建Form.jsp页面文件,代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<form action="liti5-5show.jsp" method="post">
<ul style="list-sty;e:none line-height:30px">
<li>输入用户姓名:<input type="text" name="name"/><br/></li>
<li>性别选择:
<input name="sex" type="radio" value="男"/>男
<input name="sex" type="radio" value="女"/>女
</li>
<li>
选择密码提示问题:
<select name="question">
<option value="母亲生日">母亲生日</option>
<option value="宠物名称">宠物名称</option>
<option value="电脑配置">电脑配置</option>
</select>
</li>
<li>请输入问题答案:<input type="text" name="key"/></li>
<li>
请选择个人爱好:
<div style="width:400px">
<input name="like" type="checkbox" value="唱歌跳舞"/>唱歌跳舞
<input name="like" type="checkbox" value="上网冲浪"/>上网冲浪
<input name="like" type="checkbox" value="户外登山"/>户外登山<br/>
<input name="like" type="checkbox" value="体育运动"/>体育运动
<input name="like" type="checkbox" value="读书看报"/>读书看报
<input name="like" type="checkbox" value="欣赏电影"/>欣赏电影
</div>
</li>
<li><input type="submit" value="提交"/></li>
</ul>
</form>
</body>
</html>
在esclipe中截图如下:
show.jsp页面文件代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<ul style="list-style:none; line-height:30px">
<li>输入用户姓名:
<%=new String(request.getParameter("name").getBytes("ISO8859_1"),"UTF-8")%></li>
<li>选择性别:
<%=new String(request.getParameter("sex").getBytes("ISO8859_1"),"UTF-8")%></li>
<li>选择密码提示问题:
<%=new String(request.getParameter("question").getBytes("ISO8859_1"),"UTF-8")%></li>
<li>请输入问题答案:
<%=new String(request.getParameter("key").getBytes("ISO8859_1"),"UTF-8")%></li>
<li>
请选择个人爱好:
<%
String[] like=request.getParameterValues("like");
for(int i=0; i<like.length; i++){
%>
<%= new String(like[i].getBytes("ISO8859_1"),"UTF-8")+" " %>
<% }
%>
</li>
</ul>
</body>
</html>
程序运行结果如下图所示:
在练习中遇到的问题:
如果我将getBytes(“ISO8859_1”)中的编码改成“UTF-8”运行页面就会出现乱码。
我还发现了一个问题,就是要把jsp文件建立在Webcontent下面,如果建立在Webcontent文件夹的WEB-INF下面就会出现404页面。