【Java EE (Struts2 + Spring + Hibernate)开发】:Web 之 【JSP基础知识】 1 JSP 的基本原理 %@ page contentType="text/html; charset=GBK" language="java" errorPage="" !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitio
【Java EE (Struts2 + Spring + Hibernate)开发】:Web 之 【JSP基础知识】
1 JSP 的基本原理
<%@ page contentType="text/html; charset=GBK" language="java" errorPage=""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> 第二个JSP页面 </title>
<meta name="website" content="http://www.crazyit.org"
</head>
<body>
<!-- 下面是Java脚本 -->
<%for(int i = 0 ; i < 7; i++)
{
out.println("<font size='" + i + "'>");
%>
疯狂Java训练营(Wild Java Camp)</font>
<br/>
<%}%>
</body>
</html>
1-1 JSP 注释
%--HTML 注释
!-- 注释内容 --%><body>注释示例
<!-- 增加JSP注释 -->
<%-- JSP注释部分 --%>
<!-- 增加HTML注释 -->
<!-- HTML注释部分 -->
</body>
1-2 JSP 申明
JSP 申明用于申明变量和方法。
<%! 申明部分 %><head><title> 声明示例 </title>
<meta name="website" content="http://www.crazyit.org"
</head>
<!-- 下面是JSP声明部分 -->
<%!
//声明一个整形变量
public int count;
//声明一个方法
public String info()
{
return "hello";
}
%>
<body>
<%
//将count的值输出后再加1
<br/>
<%
//输出info()方法的返回值
out.println(info());
%>
</body>
1-3 输出 JSP 表达式
<%= 表达式 %><%!public int count;
public String info()
{
return "hello";
}
%>
<body>
<!-- 使用表达式输出变量值 -->
<%=count++%>
<br/>
<!-- 使用表达式输出方法返回值 -->
<%=info()%>
</body>
1-4 JSP 脚本
通常来说,所有可执行的 Java 代码都可以通过 JSP 脚本嵌入到 HTML 页面中。
在 JSP 脚本中可以申明变量,但申明的变量都是局部变量,不能使用 private,public 等访问修饰符修饰,也不可以使用 static 修饰。
<body><%
//注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//获取数据库连接
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/javaee","root","32147");
//创建Statement
Statement stmt = conn.createStatement();
//执行查询
ResultSet rs = stmt.executeQuery("select * from news_inf");
%>
<table bgcolor="#9999dd" border="1" width="300">
<%
//遍历结果集
while(rs.next())
{
%>
<tr>
<!-- 输出结果集 -->
<td><%=rs.getString(1)%></td>
<td><%=rs.getString(2)%></td>
</tr>
<%}%>
<table>
</body>
2 JSP 的 3 个编译命令
2-1 page 指令
<% @page[language="Java"]
[extends="package.class"]
[import="package.class|package.*, ..."]
[session="true|false"]
[buffer="none|8KB|size Kb"]
[autoFlush="true|false"]
[isThreadSafe="true|false"]
[info="text"]
[errorPage="relativeURL"]
[contentType="mimeType[;charset=characterSet]"|"text/html;charSet=ISO-8859-1]"]
[pageEncoding="ISO-8859-1"]
[isErrorPage="true|false"]
%>
2-2 include 指令
<% @include file="relativeURLSpec" %><body><!-- 使用include编译指定导入页面 -->
<% @include file="scriptlet.jsp"%>
</body>
如果被嵌入的文件经常需要改变,建议使用 操作命令。
2-3 taglib 指令
3 JSP 的 7 个动作指令
3-1 forward 指令
forward 指令用于将页面响应转发到另外的页面(静态的HTML, 动态的 JSP 和 容器中的 Servlet)。
<jsp:forward page="{relativeURL|<%=expression %>}"><jsp:param ...<jsp:forward page="forward-result.jsp">
<jsp:param name="age" value="29"/>
</jsp:forward>
下一个页面使用 request 内置对象来获取增加的请求参数值。
<!-- 使用request内置对象获取age参数的值 --><%=request.getParameter("age")%>
3-2 include 指令
<jsp:include page="{relativeURL|<%=expression %>}" flush="true"或
<jsp:include page="{relativeURL|<%=expression %>}" flush="true"><jsp:param name="parameterName" value="parameterValue" />
</jsp:include><!-- 使用动态include指令导入页面 -->
<jsp:include page="forward-result.jsp"
<jsp:param name="age" value="32"/>
</jsp:include>
动态导入只是使用一个 include 方法来插入目标页面的内容,而不是将目标页面完全融入本页面中。
静态导入和动态导入的区别:
3-3 useBean/setProperty/getProperty 指令
useBean 指令
<jsp:useBean id="name" class="classname" scope="page|request|session|application"setProperty 指令
<jsp:setProperty name="BeanName" property="propertyName" value="value"getProperty 指令
<jsp:getProperty name="BeanName" property="propertyName"<body><!-- 创建lee.Person的实例,该实例的实例名为p1 -->
<jsp:useBean id="p1" class="lee.Person" scope="page"/>
<!-- 设置p1的name属性值 -->
<jsp:setProperty name="p1" property="name" value="wawa"/>
<!-- 设置p1的age属性值 -->
<jsp:setProperty name="p1" property="age" value="23"/>
<!-- 输出p1的name属性值 -->
<jsp:getProperty name="p1" property="name"/><br/>
<!-- 输出p1的age属性值 -->
<jsp:getProperty name="p1" property="age"/>
</body>
Person 类源码:
public class Person{
private String name;
private int age;
//无参数的构造器
public Person()
{
}
//初始化全部属性的构造器
public Person(String name , int age)
{
this.name = name;
this.age = age;
}
...
}
3-4 plugin 指令
3-5 param 指令
param 指令用于设置参数值,不能单独使用,与 jsp:include, jsp:forward,jsp:plugin 结合使用。
<jsp:param name="paramName" value="paramValue"4 JSP 脚本中的 9 个内置对象
4-1 application 对象
4-1-1 让多个 JSP, Servlet 共享数据
赋值
<body><!-- JSP声明 -->
<%!
int
<!-- 将i值自加后放入application的变量内 -->
<%
application.setAttribute("counter",String.valueOf(++i));
%>
<!-- 输出i值 -->
<%=i%>
</body>
取值
<!-- 直接输出application 变量值 --><%=application.getAttribute("counter")%>
Servlet 中访问 application 里的变量。
urlPatterns={"/get-application"})
public class GetApplication extends HttpServlet
public void service(HttpServletRequest request,
HttpServletResponse response)throws IOException
{
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
out.println("<html><head><title>");
out.println("测试application");
out.println("</title></head><body>");
ServletContext sc = getServletConfig().getServletContext();
out.print("application中当前的counter值为:");
out.println(sc.getAttribute("counter"));
out.println("</body></html>");
}
}
4-1-2 获得 Web 应用配置参数
<body><%
//从配置参数中获取驱动
String driver = application.getInitParameter("driver");
//从配置参数中获取数据库url
String url = application.getInitParameter("url");
//从配置参数中获取用户名
String user = application.getInitParameter("user");
//从配置参数中获取密码
String pass = application.getInitParameter("pass");
//注册驱动
Class.forName(driver);
//获取数据库连接
Connection conn = DriverManager.getConnection(url,user,pass);
//创建Statement对象
Statement stmt = conn.createStatement();
//执行查询
ResultSet rs = stmt.executeQuery("select * from news_inf");
%>
<table bgcolor="#9999dd" border="1" width="480">
<%
//遍历结果集
while(rs.next())
{
%>
<tr>
<td><%=rs.getString(1)%></td>
<td><%=rs.getString(2)%></td>
</tr>
<%
}
%>
<table>
</body><!-- 配置第一个参数:driver -->
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<!-- 配置第二个参数:url -->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/javaee</param-value>
</context-param>
<!-- 配置第三个参数:user -->
<context-param>
<param-name>user</param-name>
<param-value>root</param-value>
</context-param>
<!-- 配置第四个参数:pass -->
<context-param>
<param-name>pass</param-name>
<param-value>32147</param-value>
</context-param>
4-2 config 对象
<!-- 直接输出config的getServletName的值 --><%=config.getServletName()%><servlet>
<!-- 指定Servlet名字 -->
<servlet-name>config</servlet-name>
<!-- 指定将哪个JSP页面配置成Servlet -->
<jsp-file>/configTest2.jsp</jsp-file>
<!-- 配置名为name的参数,值为yeeku -->
<init-param>
<param-name>name</param-name>
<param-value>yeeku</param-value>
</init-param>
<!-- 配置名为age的参数,值为30 -->
<init-param>
<param-name>age</param-name>
<param-value>30</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!-- 指定将config Servlet配置到/config URL-->
<servlet-name>config</servlet-name>
<url-pattern>/config</url-pattern>
</servlet-mapping><!-- 输出该JSP名为name的配置参数 -->
name配置参数的值:<%=config.getInitParameter("name")%><br/>
<!-- 输出该JSP名为age的配置参数 -->
age配置参数的值:<%=config.getInitParameter("age")%>
4-3 exception 对象
<!-- 通过errorPage属性指定异常处理页面 --><%@ page contentType="text/html; charset=GBK" language="java" errorPage="error.jsp"
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> JSP脚本的异常机制 </title>
<meta name="website" content="http://www.crazyit.org"
</head>
<body>
<%
int a = 6;
int c = a / 0;
%>
</body>
</html>异常类型是:<%=exception.getClass()%><br/>
异常信息是:<%=exception.getMessage()%><br/>
4-4 out 对象
<%//注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//获取数据库连接
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/javaee","root","32147");
//创建Statement对象
Statement stmt = conn.createStatement();
//执行查询,获取ResultSet对象
ResultSet rs = stmt.executeQuery("select * from news_inf");
%>
<table bgcolor="#9999dd" border="1" width="400">
<%
//遍历结果集
while(rs.next())
{
//输出表格行
out.println("<tr>");
//输出表格列
out.println("<td>");
//输出结果集的第二列的值
out.println(rs.getString(1));
//关闭表格列
out.println("</td>");
//开始表格列
out.println("<td>");
//输出结果集的第三列的值
out.println(rs.getString(2));
//关闭表格列
out.println("</td>");
//关闭表格行
out.println("</tr>");
4-5 pageContext 对象
<%//使用pageContext设置属性,该属性默认在page范围内
pageContext.setAttribute("page","hello");
//使用request设置属性,该属性默认在request范围内
request.setAttribute("request","hello");
//使用pageContext将属性设置在request范围中
pageContext.setAttribute("request2","hello", pageContext.REQUEST_SCOPE);
//使用session将属性设置在session范围中
session.setAttribute("session","hello");
//使用pageContext将属性设置在session范围中
pageContext.setAttribute("session2","hello", pageContext.SESSION_SCOPE);
//使用application将属性设置在application范围中
application.setAttribute("app","hello");
//使用pageContext将属性设置在application范围中
pageContext.setAttribute("app2","hello", pageContext.APPLICATION_SCOPE);
//下面获取各属性所在的范围:
out.println("page变量所在范围:" +
pageContext.getAttributesScope("page") + "<br/>");
out.println("request变量所在范围:" +
pageContext.getAttributesScope("request") + "<br/>");
out.println("request2变量所在范围:"+
pageContext.getAttributesScope("request2") + "<br/>");
out.println("session变量所在范围:" +
pageContext.getAttributesScope("session") + "<br/>");
out.println("session2变量所在范围:" +
pageContext.getAttributesScope("session2") + "<br/>");
out.println("app变量所在范围:" +
pageContext.getAttributesScope("app") + "<br/>");
out.println("app2变量所在范围:" +
pageContext.getAttributesScope("app2") + "<br/>");
4-6 request 对象
4-6-1 获取请求头/请求参数
request 是 HttpServletRequest 接口的实例,它提供了下面几个方法来获取请求参数:
post 请求方法
<form id="form1" method="post" action="request1.jsp">用户名:<br/>
<input type="text" name="name"><hr/>
性别:<br/>
男:<input type="radio" name="gender" value="男">
女:<input type="radio" name="gender" value="女"><hr/>
喜欢的颜色:<br/>
红:<input type="checkbox" name="color" value="红">
绿:<input type="checkbox" name="color" value="绿">
蓝:<input type="checkbox" name="color" value="蓝"><hr/>
来自的国家:<br/>
<select name="country">
<option value="中国">中国</option>
<option value="美国">美国</option>
<option value="俄罗斯">俄罗斯</option>
</select><hr/>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form><%
//获取所有请求头的名称
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements())
{
String headerName = headerNames.nextElement();
//获取每个请求、及其对应的值
out.println(
headerName + "-->" + request.getHeader(headerName) + "<br/>");
}
out.println("<hr/>");
//设置解码方式,对于简体中文,使用gb2312解码
request.setCharacterEncoding("gb2312");
//下面依次获取表单域的值
String name = request.getParameter("name");
String gender = request.getParameter("gender");
//如果某个请求参数有多个值,将使用该方法获取多个值
String[] color = request.getParameterValues("color");
String national = request.getParameter("country");
%>
<!-- 下面依次输出表单域的值 -->
您的名字:<%=name%><hr/>
您的性别:<%=gender%><hr/>
<!-- 输出复选框获取的数组值 -->
您喜欢的颜色:<%for(String c : color) {out.println(c + " ");}%><hr/>
您来自的国家:<%=national%><hr/>
获取GET请求里的中文字符。
<%//获取请求里包含的查询字符串
String rawQueryStr = request.getQueryString();
out.println("原始查询字符串为:" + rawQueryStr + "<hr/>");
//使用URLDecoder解码字符串
String queryStr = java.net.URLDecoder.decode(rawQueryStr , "gbk");
out.println("解码后的查询字符串为:" + queryStr + "<hr/>");
//以&符号分解查询字符串
String[] paramPairs = queryStr.split("&");
for(String paramPair : paramPairs)
{
out.println("每个请求参数名、值对为:" + paramPair + "<br/>");
//以=来分解请求参数名和值
String[] nameValue = paramPair.split("=");
out.println(nameValue[0] + "参数的值是:" +
nameValue[1]+ "<hr/>");
4-6-2 操作 request 范围的属性
4-6-3 执行 forward 或 include
getRequestDispatcher("/a.jsp").include(request, response);getRequestDispatcher("/a.jsp").forward(request, response);4-7 response 对象
response 代表服务器对客户端的响应。
4-7-1 response 响应生成非字符响应
<%-- 通过contentType属性指定响应数据是图片 --%><%@ page contentType="image/jpeg" language="java"%>
<%@ page import="java.awt.image.*,javax.imageio.*,java.io.*,java.awt.*"%>
<%
//创建BufferedImage对象
BufferedImage image = new BufferedImage(340,160, BufferedImage.TYPE_INT_RGB);
//以Image对象获取Graphics对象
Graphics g = image.getGraphics();
//使用Graphics画图,所画的图像将会出现在image对象中
g.fillRect(0,0,400,400);
//设置颜色:红
g.setColor(new Color(255,0,0));
//画出一段弧
g.fillArc(20, 20, 100,100, 30, 120);
//设置颜色:绿
g.setColor(new Color(0 , 255, 0));
//画出一段弧
g.fillArc(20, 20, 100,100, 150, 120);
//设置颜色:蓝
g.setColor(new Color(0 , 0, 255));
//画出一段弧
g.fillArc(20, 20, 100,100, 270, 120);
//设置颜色:黑
g.setColor(new Color(0,0,0));
g.setFont(new Font("Arial Black", Font.PLAIN, 16));
//画出三个字符串
g.drawString("red:climb" , 200 , 60);
g.drawString("green:swim" , 200 , 100);
g.drawString("blue:jump" , 200 , 140);
g.dispose();
//将图像输出到页面的响应
ImageIO.write(image , "jpg"
可以在其他页面中显示这个图片页面。
<img src="img.jsp"4-7-2 重定向
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %><%
//生成页面响应
out.println("====");
//重定向到forward-result.jsp页面
response.sendRedirect("redirect-result.jsp");
%>
4-7-3 增加 Cookie
步骤:
<%//获取请求参数
String name = request.getParameter("name");
//以获取到的请求参数为值,创建一个Cookie对象
Cookie c = new Cookie("username" , name);
//设置Cookie对象的生存期限
c.setMaxAge(24 * 3600);
//向客户端增加Cookie对象<body>
<%
//获取本站在客户端上保留的所有Cookie
Cookie[] cookies = request.getCookies();
//遍历客户端上的每个Cookie
for (Cookie c : cookies)
{
//如果Cookie的名为username,表明该Cookie是我们需要访问的Cookie
if(c.getName().equals("username"))
{
out.println(c.getValue());
}
}
%>
</body><%
//以编码后的字符串为值,创建一个Cookie对象
Cookie c = new Cookie("cnName", java.net.URLEncoder.encode("孙悟空" , "gbk"));
//设置Cookie对象的生存期限
c.setMaxAge(24 * 3600);
//向客户端增加Cookie对象
response.addCookie(c);
//获取本站在客户端上保留的所有Cookie
Cookie[] cookies = request.getCookies();
//遍历客户端上的每个Cookie
for (Cookie cookie : cookies)
{
//如果Cookie的名为username,表明该Cookie是我们需要访问的Cookie
if(cookie.getName().equals("cnName"))
{
//使用java.util.URLDecoder对Cookie值进行解码
out.println(java.net.URLDecoder
.decode(cookie.getValue()));
4-8 session 对象
<body><form method="post" action="processBuy.jsp">
书籍:<input type="checkbox" name="item" value="book"/><br/>
电脑:<input type="checkbox" name="item" value="computer"/><br/>
汽车:<input type="checkbox" name="item" value="car"/><br/>
<input type="submit" value="购买"/>
</form>
</body><%@ page contentType="text/html; charset=gb2312" language="java"
<%@ page import="java.util.*"%>
<%
//取出session范围的itemMap属性
Map<String,Integer> itemMap = (Map<String,Integer>)session
.getAttribute("itemMap");
//如果Map对象为空,则初始化Map对象
if (itemMap == null)
{
itemMap = new HashMap<String,Integer>();
itemMap.put("书籍" , 0);
itemMap.put("电脑" , 0);
itemMap.put("汽车" , 0);
}
//获取上个页面的请求参数
String[] buys = request.getParameterValues("item");
//遍历数组的各元素
for (String item : buys)
{
//如果item为book,表示选择购买书籍
if(item.equals("book"))
{
int num1 = itemMap.get("书籍").intValue();
//将书籍key对应的数量加1
itemMap.put("书籍" , num1 + 1);
}
//如果item为computer,表示选择购买电脑
else if (item.equals("computer"))
{
int num2 = itemMap.get("电脑").intValue();
//将电脑key对应的数量加1
itemMap.put("电脑" , num2 + 1);
}
//如果item为car,表示选择购买汽车
else if (item.equals("car"))
{
int num3 = itemMap.get("汽车").intValue();
//将汽车key对应的数量加1
itemMap.put("汽车" , num3 + 1);
}
}
//将itemMap对象放到设置成session范围的itemMap属性
session.setAttribute("itemMap"
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> 购买的物品列表 </title>
<meta name="website" content="http://www.crazyit.org"
</head>
<body>
您所购买的物品:<br/>
书籍:<%=itemMap.get("书籍")%>本<br/>
电脑:<%=itemMap.get("电脑")%>台<br/>
汽车:<%=itemMap.get("汽车")%>辆
<p><a href="shop.jsp">再次购买</a></p>
</body>
</html>
5 JSP 2 的自定义标签
(待补充。。。)
6 JSP 2 特性
(待补充。。。)