JSP重点
第三章 HTML与CSS简介
列表
有序列表(<ol></ol>)
<ol type="1" start=2>
<li type="a/A/I/i" value=2 > A </li>
<li> B </li>
</ol>
无序列表(<ul></ul>)
<ul type="disc">
<li> a </li>
<li type="circle"> b </li>
<li type="square"> c </li>
</ul>
插入内容
插入图片
<img src="./image/1.jpg" alt="picture" width="360" height="200" align="center" />
插入视频
<embed src="./video/2.mp4" width="500" height="500" alt="video"></embed>
插入超链接
<a href="https://www.baidu.com" target="_blank">跳转百度官网</a>
属性 | 内容 |
---|
_parent | 目标文档载入当前窗口的父窗口 | _self | 默认值,目标文档载入并显示在当前窗口中 | _blank | 浏览器总在一个新打开、未命名的窗口中载入目标文档 |
表格
<table border="1" width="90%" bordercolor="red" cellpadding="2">
<tr height="50" valign="middle" >
<th width="33%" colspan="2">Java方向</th>
<th width="36%" colspan="2">软测方向</th>
<th width="36" colspan="2">.NET方向</th>
</tr>
<tr align="center">
<td width="16%">1</td>
<td width="16%">2</td>
<td width="17%">3</td>
<td width="17%">4</td>
<td width="17%">5</td>
<td width="17%">6</td>
</tr>
</table>
**<table>**属性
属性 | 内容 |
---|
border | 设置表格边框的宽度,若为0,则表示边框不可见 | cellspacing | 单元格边框到表格边框的距离 | cellpading | 单元格内文字到单元格边框的距离 | width | 表格宽度,20%表示表格宽度为整个页面宽度的20% | height | 同width | bgcolor | 表格背景色 | bordercolor | 表格边框颜色 | align | 水平对齐方式,left,right,center | valign | 垂直对齐方式,top,middle,baseline |
<tr>属性
属性 | 内容 |
---|
bordercolor | 该行的外边框颜色 | bgcolor | 该行单元格的背景颜色 | height | 单元格高度 | align | 水平对齐方式,left,right,center | valign | 垂直对齐方式,top,middle,baseline |
<td>属性
属性 | 内容 |
---|
colspan | 单元格所占列数,默认值为1 | rowspan | 单元格所占行数,默认值为1 | background | 设置单元格背景图像 | width | 设置单元格宽度 |
表单
<form action="url" method="post" name="SubRegisterInfo" onsubmit="function" onreset="function" target="window"></form>
属性 | 内容 |
---|
action | 处理表单数据的处理程序地址 | method | 设置处理程序从表单中获取信息的方式,取值为get或post | name | 表单的名字 | onsubmit、onreset | 点击submit或reset按钮后执行的脚本函数名 | target | 设置显示表单内容的窗口名 |
表单域
<input type="text" size="20" maxlength="20" />
<br />
<input type="submit" />
<br />
<input type="reset" />
<br />
<input type="checkbox" checked />
<br />
<input type="radio" checked />
<br />
<input type="password" />
属性 | 内容 |
---|
type | text、submit、reset、checkbox、hidden、image、password、radio | name | 输入域名字 | value | 默认值 | align | 对齐方式,left,right,middle,top | onclick | 按下按钮后执行的脚本函数名 |
HTML中引入CSS的方法
嵌入式样式表
在标签上使用style属性,添加css属性就可,作用范围只限于本标签
<p style="color: red;font-size: 10pt;"> aaaaaaaaa </p>
内联式样式表
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
p{
font-family: 宋体;
font-size: 9pt;
color: blue;
text-decoration: underline;
}
h2{
font-family: 宋体;
font-size: 20pt;
color: red;
}
</style>
</head>
<body>
<p> Hello </p>
<h2> World</h2>
</body>
</html>
外联式样式表
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link href="./css/p.css" rel="stylesheet" type="text/css" />
</head>
<body>
<p> Hello </p>
<h2> World</h2>
<h1 class="text">外联式样式表</h1>
</body>
</html>
p{
font-family: 宋体;
font-size: 9pt;
color: blue;
text-decoration: underline;
}
h2{
font-family: 宋体;
font-size: 20pt;
color: red;
}
.text{
font-family: 宋体;
font-size: 9pt;
color: orange;
text-decoration: blink;
}
CSS的优先级
嵌入式样式表(优先级最高)、内联式样式表、外联式样式表
CSS样式表属性
字体属性
属性 | 内容 |
---|
font-family | 字体名称,任意自已名称 | font-style | 字体风格:normal、italic(斜体)、oblique(倾斜) | font-weight | 字体加粗:normal、bold(一般加粗)、bolder(重加粗)、lighter(轻加粗) | font-size | 绝对大小:xx-small,x-small,small,medium,large,x-large,xx-large | font | 字体属性的略写,如font:italic bold 12pt Times,serif |
颜色和背景属性
属性 | 内容 |
---|
font-family | 前景色:颜色名称、RGB值、16进制值 | background-color | 背景色,颜色名称、RGB值、16进制值 | background-image | 背景图案:url | background-attachment | 背景图片是否滚动:scroll(背景图片和颜色一起滚动)、fixed |
文本属性
属性 | 内容 |
---|
letter-spacing | 字母之间间距:normal、长度:设置字间距长度,度量单位:mm、cm、pt、px、em | word-spacing | 单词之间间距:normal、长度:数值 | text-decoration | 文字装饰样式:underline:下划线、overline:上划线、line-through:删除、blink:闪烁 | vertical-align | 垂直对齐方式:baseline、sub、top、middle、bottom | text-align | 水平对齐方式:left、right、center、justify | line-height | 行高:normal、数字、长度、百分比 | text-indent | 文本首行缩进方式:长度、百分比 | text-transform | 文本转换方式:capitalize:元素中每个单词第一个字母大写、uppercase:全部大写、lowercase:全部小写 |
第五章 JSP基础知识
JSP的三种注释方法
隐藏注释
隐藏注释是JSP的标准注释,在JSO程序中,在发布JSP网页时完全被忽略,也不会发布到客户浏览器上
<%--注释语句--%>
HTML注释
HTML注释在发布网页时可以再浏览器源文件窗口中看到,注释的内容会被输送到客户端的浏览器上。
<!--注释语句-->
Java注释
同隐藏注释
<%/*注释语句*/%> 或<%//注释语句%>
JSP常用脚本元素
变量和方法声明
<%!
String str = "Hello World";
%>
<%
String str1 = "world";
%>
<%! %> :全局声明
<% %> :局部声明
表达式和脚本
<%!
String str="Hello";
%>
<!-- JSP表达式 -->
JSP表达式:<%=str%>
<!-- JSP脚本 -->
JSP脚本:<%out.println(str)%>
JSP常用指令
page指令
page指令用于定义JSP文件中的全局属性,其作用域为它所在的JSP文件页面 和其包含的文件。
属性 | 内容 |
---|
language | 用于指定JSP页面中使用的脚本语言,其默认值为Java。 | extends | 用于指定JSP编译器父类的完整限定名,此JSP页面产生的Servlet将由该父类扩展而来。 | **import ** | 用于导入JSP页面使用的Java API类库。import属性是所有page属性中唯一可以多次设置的属性,用来指定JSP页面中所用到的类。 | **session ** | 用于指定是否可以使用session对象,若允许页面参与HTTP会话, 就设置为true,否则设为false,其默认值为true。 | buffer | 用于设定页面的缓冲区大小(字节数),属性值为none,表示禁 用缓冲区,其默认值为8KB。 | autoFlush | 用于指定JSP页面缓冲区是否自动刷新输出,其默认值为true。 如果该属性设置为true,则页面缓冲区满时自动刷新输出;否则,当页面缓冲 区满时抛出一个异常。 | **isThreadSafe ** | 用于指定JSP页面是否能够处理一个以上的请求,如果为 true,则该页面可能同时收到JSP引擎发出的多个请求;反之, JSP引擎会对收 到的请求进行排队,当前页面在同一时刻只能处理一个请求。其默认值为true。 | info | 用于指定JSP页面的相关信息文本,无默认值。 | errorPage | 用于指定错误页面,无默认值。当页面出现一个没有被捕获的 异常时,错误信息将以throw语句抛出,而被设置为错误信息网页的JSP页面, 将利用exception隐含对象,获取错误信息。 relativeURL默认设置为空,即没有 错误处理页面。 | isErrorPage | 指定JSP页面是否为处理异常错误的页面,其默认值为 false。 如果将isErrorPage属性设置为true,则固有的exception对象脚本元素可用。 | **contentType ** | 用于指定内容MIME类型和JSP页面的编码方式。对于普通JSP页面,默认的contentType属性值为"text/html;charset=ISO-8859-1"。对于JSP文档,默认的contentType属性值为"text/html;charset=ISO-8859-1 "。 | **pageEncoding ** | 用于指定JSP页面的编码方式,默认值为ISO-8859-1,为支持中文可设置为UTF-8。 |
<%@page language="java" import="java.util.Date"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
taglib指令
taglib指令用来指定页面中使用的标签库以及其自定义标签的前缀。
<%@taglib uri=" tagLibraryURI" prefix=" tagPrefix"%>
属性 | 内容 |
---|
**uri ** | 统一资源标识符属性用于指定标签库的存放位置,并告诉JSP引擎在编译JSP程序时如何处理指定标签库中的标签。 | prefix | 用于指定标记库中所有动作元素名中使用的前缀,无默认值。 |
include指令
include指令用于在JSP编译时, 为页面插入一个静态文件,如JSP页面、 HTML页面、 文本文件或是一段Java程序。
<%@ include file="filename"%>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8LLtCg9W-1653395035907)(F:\Sync\大学学习\2021-2022学年第二学期\JSP程序设计\考试\JSP重点.assets\image-20220523190136605.png)]
JSP常用动作
在客户请求JSP页面时, 利用JSP动作可以传递参数、 动态地插入文件、 重用JavaBean组件、 把用户重定向到另外的页面。
<jsp:param>
<jsp:param>动作可以用于<jsp:include>、 < jsp:forward>和<jsp:plugin>动作体中,为其他动作提供附加信息。
<jsp:param name="paramName" value="param Value"/>
name属性用于指定参数名称,不可以接受动态值。 value属性用于指定参数值,可以接受动态值。
<jsp:include>
<jsp:include>动作用来把指定文件插入正在生成的页面中。
<jsp:include page="relative URL" flush="true" />
或者
<jsp:include page="fileName" flush="true">
<jsp:param name="paramName" value="paramValue"/>
</jsp:include>
- page属性指定所包含的资源的相对路径,可以接受动态值。
- flush属性指定在包含目标资源之前是否刷新输出缓冲区,默认值为false。 flush属性不可以接受动态值。
| 特点 | 语法格式 |
---|
include指令 | 可以在JSP页面转换成Servlet之前,将JSP代码插入其中。 | <%@include file="文件名"%> | <\jsp:include>动作 | 在主页面被请求时,将其它页面的输出包含进来。 | <\jsp:include page="文件名"flush="true"/> | 根本区别 | 在于它们被调用的时间。 <\jsp:include>动作在请求期间被激活,而include指令在页面转换期间被激活。 | 结论 | include指令执行时将被导入页面的jsp代码完全融入,两个页面融合 成一个Servlet;而<\jsp:include>动作则在Servlet中使用include方法来 引入被导入页面的内容。因此include指令执行时不需编译,速度快; <\jsp:include>动作需要加载执行,速度慢。 |
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
以下是Hello1.jsp的内容
<hr>
<jsp:include page="hello1.jsp">
<jsp:param name="name" value="Jsp"/>
</jsp:include>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%=request.getParameter("name")%>你好!
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ftcyYbvG-1653395035908)(F:\Sync\大学学习\2021-2022学年第二学期\JSP程序设计\考试\JSP重点.assets\image-20220523193119435.png)]
<jsp:useBean>
<jsp:useBean>动作用来装载一个将在JSP页面中使用的JavaBean。 这个功能非常有用, 能够实现JavaBean组件重用。
<jsp:useBean id="beanInstanceName" scope="page | request |session | application“ class="package.class" type="package.class" beanName="package.class"/>
属性 | 内容 |
---|
**id ** | 指定该JavaBean的实例名称, 不可接受动态值。 如果能够找到id和 scope相同的Bean实例, <jsp:useBean>动作将使用已有的Bean实例而不是创建 新的实例。 | **scope ** | 指定Bean作用域范围, 不可以接受动态值, 可选作用域有: page、request、 session和application。 page是默认值, 表示该Bean只在当前页面内可用( 保存在当前页面的PageContext内) 。 request: 表示该Bean在当前的客户请求内有效( 保存在ServletRequest对象内) 。 session: 表示该Bean对当前HttpSession内的所有页面都有效, 即会话作用域。 application: 表示该Bean在任何使用相同的application的JSP页面中有效, 即整个应用程序范围内有效。 | **class ** | 指定Bean的类路径和类名, 不可接受动态值, 这个class不能是抽象的。 | type | 指定引用该对象的变量的类型, 它必须是Bean类的名字、 超类名字、该类所实现的接口名字之一。 变量的名字是由id属性指定的 | beanName | 指定bean的名字, 可以接受动态值。 beanName属性必须与 type属性结合使用, 不能与class属性同时使用。 |
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<hr>
<jsp:useBean id="time" class="java.util.Date"/>
现在时间:<%=time%>
</body>
</html>
<jsp:setProperty>
<jsp: setProperty>动作用来设置、 修改已经实例化的Bean中的属性值。
<jsp:setProperty name=“beanInstanceName” property= “*” |property=“propertyName” [param=“parameterName”| value = “value”]/>
属性 | 内容 |
---|
**name ** | 必需。 它表示要设置哪个Bean的属性, 不可接受动态值 | **property ** | 必需。 它表示要设置哪个属性。 如果property的值是“*” , 表示所有名字和Bean属性名字匹配的请求参数都将被传递给相应属性的set方法。 | param | 可选。 它指定用哪个请求参数作为Bean属性的值。 如果当前请求没有参数, 则什么事情也不做, 系统不会把null传递给Bean属性的set方法。 因此, 可以让Bean自己提供默认属性值, 只有当请求参数明确指定了新值时才修改默认属性值。 | value | 可选。 该属性用来指定Bean属性的值。 |
<jsp:useBean id="user" scope="page" class="ch.UserRegisterBean"/>
<jsp:setProperty name="use" property="*"/>
<!-- -->
<jsp:getProperty>
<jsp:getProperty>动作获取指定Bean属性的值,转换成字符串,然后输出。
<jsp:getProperty name="beanInstanceName" property="propertyName" />
<jsp:getProperty>元素可以获取Bean的属性值并使用或将其显示在JSP页面中。在使用<jsp:getProperty>前,必须用<jsp:useBean>创建实例化对象。
<hr>
<jsp:useBean id="user" scope="page" class="ch.UserRegisterBean"/>
<jsp:setProperty name="use" property="*"/>
<%-- 使用Bean方法获取属性值 --%>
<%=user.getUserName()%>
<br>
<%-- 使用动作获取属性值 --%>
<jsp:getProperty name="user" property="userName">
<jsp:forward>
<jsp:forward>用于引导客户端的请求到另一个页面或者是另一个Servlet。
<jsp:forward page="relativeURL" />
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>login.jsp</title>
</head>
<body>
<form action="loginCheck.jsp">
<table>
<tr>
<td>输入用户名:</td>
<td><input type="text" name="name" value="<%=request.getParameter("name")%>"/></td>
</tr>
<tr>
<td>输入密码:</td>
<td><input type="password" name="name"/></td>
</tr>
<tr>
<td><input type="submit" value="登录"/></td>
</tr>
</table>
</form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>loginCheck.jsp</title>
</head>
<body>
<%
String name = request.getParameter("name");
String password = request.getParameter("password");
if (name.equals("QQ")&&password.equals("123")){
%>
<jsp:forward page="success.jsp">
<jsp:param name="user" value="<%=name%>"/>
</jsp:forward>
<%}else{%>
<jsp:forward page="login.jsp">
<jsp:param name="user" value="<%=name%>"/>
</jsp:forward>>
<%}%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>success.jsp</title>
</head>
<body>
<%=request.getParameter("name")%> 登录成功!
</body>
</html>
第六章 JSP常用内置对象
out对象
方法 | 含义 |
---|
print()/println() | 用于输出数据。 print()方法把数据输出到客户端, 而println()方法除了把数据输出到客户端外,还在后面添加一空行 | newLine() | 用于输出一个换行字符,用于实现换行功能 | flush() | 用于输出缓冲区里的数据。该方法先把缓冲区中的数据输出到客户端,然后再清除缓冲区中的数据。 | clearBuffer() | 用于清除缓冲区里的数据,但是不会把缓冲区的数据输出到客户端。 | getBufferSize() | 用于获取缓冲区的大小 | getRemaining() | 用于获取缓冲区剩余空间 | isAutoFlush() | 用于判断是否自动刷新缓冲区。自动刷新返回true,否则返回false。 | close() | 用于关闭输出流 |
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>out对象</title>
</head>
<body>
<%
for (int i=0;i<3;i++){
out.println("<h3>我的理想是什么...</h3>");
}
String str = "我一定学好JSP程序设计课程!";
out.print(str+"<br/>");
out.println("加油");
%>
</body>
</html>
request对象
request对象用于获取客户端的各种信息。
request对象的生命周期
request对象的声明周期由JSP容器控制,当客户端通过HTTP请求到一个JSP页面时,JSP容器就会创建request对象并将请求封装到request对象中,当JSP容器处理完请求,request对象将会被销毁。
request对象的作用
request对象主要用接收客户端通过HTTP传送给服务器端的数据,可以通过其方法对数据进行操作。
解决乱码问题的方法
request.setCharacterEncoding("UTF-8");
request对象的重点方法
方法 | 含义 |
---|
getParameter(String name) | 用于获得客户端传送给服务器端的指定参数的值,返回值是字符串 | getAttribute(String name) | 用于获取request对象中属性name的值。 | setAttribute(String name,Object obj) | 用于设置request对象中的属性及其属性值。 | removeAttribute(String name) | 用于删除request对象中的属性name及其属性值。 |
response对象
session对象
pageContext对象
exception对象
application对象
第七章 数据库基本操作
JDBC使用
流程
-
注冊驱动 (仅仅做一次) Class.forName("com.mysql.jdbc.Driver"); -
建立连接(Connection) Connection conn = DriverManger.getConnection(url,account,password); -
创建传输器Statement Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY); -
运行SQL语句 ResultSet rs = stmt.executeUpdate(sql); -
处理运行结果(ResultSet) rs.getString('');/rs.getString(1); -
释放资源 rs.close(); stmt.close(); conn.close();
代码
<%@page import="java.sql.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
Connection conn;
Statement stmt;
ResultSet rs;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://121.36.86.90:3306/train?useUnicode=true&characterEncoding=utf-8","XXX","XXX");
// SQL Server数据库
// Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
// String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery("select * from info");
while(rs.next()){
%>
<tr>
<td align="center"><%=rs.getString("studentNumber")%></td>
<td align="center"><%=rs.getString("studentName")%></td>
<td align="center"><%=rs.getString("studentSex")%></td>
<td align="center"><%=rs.getString("studentAge")%></td>
<td align="center"><%=rs.getString("studentWeight")%></td>
</tr>
<%
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
%>
</body>
</html>
Statement属性
属性 | 含义 |
---|
ResultSet.TYPE_FORWARD_ONLY | 表示结果集只能向下滚动 | ResultSet.TYPE_SCROLL_INSENSITIVE | 表示结果集的游标可以上下滚动,当数据库变化时,当前结果集不变 | ResultSet.TYPE_SCROLL_SENSITIVE | 表示结果集的游标可以上下滚动,当数据库变化时,当前结果集同时改变 | ResultSet.CONCUR_READ_ONLY | 不能用结果集更新数据库中的表 | ResultSet.CONCUR_UPDATABLE | 可以用结果集更新数据库中的表 |
语句==(重要)==
创建表语句
CREATE TABLE QUESTION(
QuestionID VARCHAR(9),
Factor1 INT,
Operator VARCHAR(2),
Factor2 INT,
Result INT,
CategoryID VARCHAR(9)
);
插入语句
INSERT INTO <表名>(<属性列1>,<属性列2>)
VALUES (<常量1>,<常量2>);
删除语句
DELETE FROM Question
WHERE CategoryID = (Select CategoryID FROM Category where Name = 'Top');
更新语句
UPDATE Question
SET Operator = '*'
WHERE CategoryID = (SELECT CategoryID
FROM Category
WHERE Name = 'Junior');
查询语句
SELECT Factor1,Operator,Factor2,Result
FROM Question
WHERE Operator = '+'
AND Result<50;
SELECT [ALL | DISTINCT] column1[,column2]
FROM table1[,table2]
[WHERE "conditions"]
[GROUP BY "column-list"]
[HAVING "conditions]
[ORDER BY "column-list" [ASC | DESC] ]
三种接口发送执行查询语句
Statement | 用于执行简单的不带参数的SQL语句 |
---|
PreparedStatement | 用于执行带有IN类型参数的预编译过的SQL语句 | CallableStatement | 用于执行一个数据库的存储过程 |
Statement接口的常用方法
方法 | 含义 |
---|
executeQuery() | 用来执行查询,返回结果集 | executeUpdate() | 用于获取request对象中属性name的值。返回影响的行数 | execute() | 用于设置request对象中的属性及其属性值。 用于判断该SQL语句是否返回了ResultSet。 | setMaxRow() | 设置结果集容纳的最多行数 | getMaxRow() | 获取结果集的最多行数 | setQueryTimeOut() | 设置一个语句执行的等待时间 | getQueryTimeOut() | 获取一个语句执行的等待时间 | close() | 关闭Statement对象,释放其资源 |
第九章 JSP与JavaBean
JavaBean代码规范
- 必须有一个无参的构造函数。
- 对在Bean中定义的所有属性提供getter和setter方法,并且这些方法是公共的。
- 对于boolean类型的属性,其getter方法的形式为isXXX的,其中XXX为首字母大写的属性名。
- 对于数组类型的属性,要提供形式为getXXX和setXXX的方法。
JavaBean特性
- 可以实现代码的重复使用。
- 容易维护、容易使用且容易编写。
- 可以在支持Java的任何平台上使用,而不需要重新编译。
- 可以与其它部件的进行整合。
- 使用JavaBean的好处是简化了页面设计,并帮助将表示层和业务逻辑层分离。
示例代码
public class Login {
private String userName;
private String password;
public Login(){
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
使用JavaBean
在JSP页面中使用JavaBean有两种方式。第一种方式可以通过5.5节中的<jsp:useBean>动作加载JavaBean,使用<jsp:setProperty>动作给JavaBean属性值传送参数,使用<jsp:getProperty>动作获取属性的值。第二种方式可以直接在JSP页面中以Java脚本的形式直接使用。
使用JSP动作
<jsp:useBean id="login" class="ch.Login"/>
<jsp:setProperty name="login" property="*"/>
<jsp:getProperty name="login" property="userName"/>
使用Java脚本
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<jsp:useBean id="login" class="ch.Login"/>
<jsp:setProperty name="login" property="*"/>
<jsp:getProperty name="login" property="userName"/>
<%-- 等价脚本 --%>
<%@page import="ch.Login" %>
<%
Login login1 = new Login();
login1.setUserName(request.getParameter("userName"));
login1.setUserName(request.getParameter("password"));
out.println(login1.getUserName());
out.println(login1.getPassword());
%>
</body>
</html>
JavaBean的作用域及作用
<jsp:useBean id="login" class="ch08.Login" scope="page"/>
page作用域
JSP页面内的所有实例的默认作用域都为page,并且允许在为局部变量指定的范围内使用这种数据(仅限于在本页面内使用)
request作用域
JSP页面使用request表示同一次请求所涉及到的服务器资源(可能是页面、 servlet等)中使用,例如,程序中有使用<jsp:forward/> <jsp:include/>这些动作时,所涉及到的页面(或其它类型的资源)与本页面属于同一次的请求。
session作用域
可在同一次会话期间所访问的资源中使用,实际上也就是所有的页面都能访问。如果需要提供有状态的用户,则采用session作用域。在线聊天、在线购物、在线论坛、电子商务、网上银行, session作用域都能满足要求。对用户提供从请求到请求的追踪,为用户提供无缝的、持久的操作环境。
application作用域
application作用域就是服务器启动到关闭的整段时间,在这个作用域内设置的信息可以被所有应用程序使用。
第十章 JavaServlet技术
什么是Servlet技术
Servlet是Java Web应用程序中的组件技术,是运行在服务器端的Java应用程序,实现与JSP类似的功能, Servlet本身是一个Java类,可以动态地扩展服务器的能力。
Servlet技术的作用
- 获取客户端浏览器通过HTML表单提交的数据及相关信息。
- 创建并返回对客户端的动态响应页面。
- 访问服务端资源,如文件、数据库。
- 为JSP页面准备动态数据,与JSP一起协作创建响应页面。
Servlet技术的优点
- 有效性。当CGI程序完成请求的处理工作时, 就会终止程序, 这样就难以缓存计算结果、 保持数据库连接开放, 并允许依赖于永久数据的其它优化操作。 但在完成响应之后, Servlet仍然保留在内存中, 因此可以直接在请求之间存储任意复杂的数据。
- 方便。Servlet包含扩展基础结构, 能够自动对HTML表单数据进行分析和解码、 读取和设置 Http头、 处理Cookie、 跟踪会话以及许多其它类似的高级功能。
- 强大。Servlet 可以直接与Web服务器对话,与Web服务器的通信更易于将相对URL转换成具体的路径名。 多个Servlet之间还能共享数据, 这更易于实现数据库连接共享和类似资源共享优化操作。
- 可移植性。几乎每种主要的Web服务器都可通过插件或直接支持Servlet。
- 安全。与传统的CGI程序相比, Servlet更加安全。
- 便宜。一旦拥有了某种Web服务器, 不管其成本如何, 添加Servlet支持。
Servlet技术的应用
通过Servlet获取表单中的数据
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>数据页面</title>
</head>
<body>
<form method="post" action="${pageContext.request.contextPath}/ThreeParams">
<p>数据1<input type="text" name="gr1"></p>
<br>
<p>数据2<input type="text" name="gr2"></p>
<br>
<p>数据3<input type="text" name="gr3"></p>
<br>
<p>
<input type="submit" value="提交">
<input type="reset" value="清除">
</p>
</form>
</body>
</html>
import java.io.*;
import javax.servlet.*;
public class ThreeParams extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println(request.getParameter("gr1") +"<br>");
out.println(request.getParameter("gr2") +"<br>");
out.println(request.getParameter("gr3") +"<br>");
out.println("</body>");
out.println("</html>");
out.close();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>ThreeParams</servlet-name>
<servlet-class>twelve.ThreeParams</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ThreeParams</servlet-name>
<url-pattern>/ThreeParams</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>
重定向与转发
重定向是将用户从当前页面或者Servlet定向到另外一个JSP页面或者Servlet;
response.sendRedirect("sendFord.jsp");
转发是用户对当前JSP页面或者Servlet对象的请求转发给另外一个JSP页面或者Servlet对象。
RequestDispatcher dispatcher= request.getRequestDispatcher("ShowMessage");
dispatcher.forward(request,response);
区别:
- RequestDispatcher的forward()方法只能将请求转发给同一个Web应用中的组件; HttpServletResponse的sendRedirect()方法不仅可以重定向到当前应用程序中的其它资源, 还可以重定向到同一个站点上的其它应用程序中的资源, 甚至是使用绝对URL重定向到其它站点的资源。
- 调用HttpServletResponse的sendRedirect()方法重定向的访问过程结束后, 浏览器地址栏中显示的URL会
发生改变, 由初始的URL地址变成重定向的目标URL;而调用RequestDispatcher的forward()方法的请求转发过程结束后, 浏览器地址栏保持初始的URL地址不变。 - HttpServletResponse的sendRedirect()方法对浏览器的请求直接作出响应, 响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;而RequestDispatcher的forward()方法在服务器端内部将请求转发给另外一个资源, 浏览器只知道发出了请求并得到了响应结果, 并不知道在服务器程序内部发生了转发
行为。 - RequestDispatcher的forward()方法的调用者与被调用者之间共享相同的request对象和response对象, 它们 属于同一个访问请求和响应过程;而HttpServletResponse的sendRedirect()方法调用者与被调用者使用各自的request对象和response对象, 它们属于两个独立的访问请求和响应过程。
- 无论是RequestDispatcher的forward()方法, 还是HttpServletResponse的sendRedirect()方法, 在调用它们之前, 都不能有内容已经被实际输出到了客户端。 如果缓冲区中已经有了一些内容, 这些内容将被从缓冲区中清除。
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>数据输入页面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/Verify" method="post">
请输入一个实数:<input type="text" name="number">
<input Type="submit" value="确定">
</form>
</body>
</html>
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Verify extends HttpServlet {
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{
String number=request.getParameter("number");
try{
double n=Double.parseDouble(number);
if(n>6000||n<-6000){
response.sendRedirect("sendForward.jsp");
} else{
RequestDispatcher dispatcher= request.getRequestDispatcher("ShowMessage");
dispatcher.forward(request,response);
}
}
catch(NumberFormatException e){
response.sendRedirect("sendForward.jsp");
}
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException{
doPost(request,response);
}
}
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ShowMessage extends HttpServlet {
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{
response.setContentType("text/html;charset=GB2312");
PrintWriter out=response.getWriter();
String number=request.getParameter("number");
double n=Double.parseDouble(number);
out.println(number+"的平方:"+(n*n));
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException{
doPost(request,response);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>Verify</servlet-name>
<servlet-class>twelve.Verify</servlet-class>
</servlet>
<servlet>
<servlet-name>ShowMessage</servlet-name>
<servlet-class>twelve.ShowMessage</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Verify</servlet-name>
<url-pattern>/Verify</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ShowMessage</servlet-name>
<url-pattern>/ShowMessage</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>
|