通过表单、地址栏、超链接发数据
下例是直接分析地址栏:
http://127.0.0.1:8080//test/base/04/demo04.jsp?uname=zs&inst=bask&inst=reading&inst=dance
1、如何实现?
通过表单里的复选框 checkbox
2、代码实现:
每一个选项的类型和参数名相同,但参数值不同
<form action="demo05.jsp">
<input type="checkbox" name="inst" value="bask"/>篮球
<input type="checkbox" name="inst" value="reading"/>读书
<input type="checkbox" name="inst" value="dance"/>跳舞
</form>
3、为什么复选框一定要选值?
该请求的get请求为
http://127.0.0.1:8080//test/base/04/demo04.jsp?uname=
4、如何获得参数值?
request 创建字符串数组对象存储多值参数的value值
String name = request.getParameter(uname);
// 字符串数组对象 哈希地址
String[] inst1 = request.getParameterValues(inst); //String[]
for(i=0;i<inst1.length;i++){
System.out.println(inst1[i]);
}
注意:inst1是取得参数的哈希地址,不是真正的物理地址
5、两种返回值的对比:
request.getParameter(name); 返回字符串对象
request.getParameterValues(inst); 返回字符串数组对象
request.getParameterValues(inst); 具有通用性
6、什么叫程序健壮?
让程序没有出错的可能,提前预防不让其发生。 本例中指的是让多值请求不出现空指针异常
如何更改程序使其具有健壮性 ?
通过enumeration集合进行自身迭代,直到nextElement=null时,迭代结束。
7、运行过程:
1)提交请求,Tomcat为请求创建request内置对象接收数据
2)因无法确定后期维护过程中参数的更改,因此,创建enumeration集合(线程安全,效率低)存放从request中收集的所有参数名, 调用方法getParameterNames
3)依次通过enumeration内的元素取得request的参数值,调用getParameterValues
request.setCharacterEncoding("GBK");
Enumeration enu = request.getParameterNames();
while(enu.hasMoreElements()){
String name = (String)enu.nextElement
String[] temp = request.getParameterValues(name);
out.println("name");
for(i=0;i<temp.length;i++){
out.println("temp[i]");
}
}
8、使用enumeration不出现空指针异常的原因:
enumertaion本身是个接口,不能自己创建对象,对外不提供构造方法,只能通过其他方法来创建,本例中使用request.getParameterNames自动创建enumeration的对象。只收集有确定参数值的参数名,空串属于确定参数值(字符串长度为0的对象),而空没有值,因此Enumeration不收集未选中的inst参数名。因此后期取值时不存在inst参数名对应的值。
9、response作用:
10、定时刷新
http://127.0.0.1:8080/test/base/05/responseDemo00.jsp
responseDemo00.jsp
<%@page contentType="text/html;charset=gb2312"%>
<%!
// 此处为全局变量,初始化一次
int i = 0 ;
%>
<%
// 一秒种刷新一次,每次使i自增 response向http协议头放控制信息
response.setHeader("refresh","1") ;
%>
<!--在浏览器输入结果信息-->
<h1><%=++i%></h1>
11、定时跳转:
responseDemo01.jsp
<%@page contentType="text/html;charset=gb2312"%>
<%
// 两秒种后跳动responseDemo02.jsp页面
response.setHeader("refresh","2;URL=responseDemo02.jsp") ;
%>
两秒后跳转到欢迎页!!!<br>
如果没有跳转,请按<a href="responseDemo02.jsp">这里</a>!!!
responseDemo02.jsp
<%@page contentType="text/html;charset=gb2312"%>
<h1>欢迎光临:responseDemo02.jsp</h1>
12、客户端跳转(重定向)
定时跳转的特例:间隔时间设为0
客户端跳转主体:浏览器
服务端跳转主体:服务器
responseDemo03.jsp
<%@page contentType="text/html;charset=gb2312"%>
<h1>欢迎光临:responseDemo03.jsp</h1>
<%
System.out.println("** 跳转之前...") ;
%>
<%
// 进行跳转 客户端跳转,由 浏览器发送请求
//服务器向浏览器设定控制信息,当请求结束时,浏览器自动发请求,前一个request与后一个request不同,因此不能传参
response.sendRedirect("responseDemo04.jsp?uname=ZTE") ;
//控制浏览器,重新发请求,重新传参
//response.setHeader("refresh","0;URL=responseDemo04.jsp?uname=ZTE") ;
%>
//服务端跳转
<%--<jsp:forward page="responseDemo04.jsp"/>--%> //不好用,只能页面向页面跳转 跳转主体是服务器 客户端不需要重新发请求,
//跳转前后是同一个request请求,所以服务端跳转可以传参
// 地址栏不会变化
<% //request.getRequestDispatcher("responseDemo04.jsp").forward(request, response); //一个组件向另一个组件跳转
//客户端跳转服务端后面的代码会执行
System.out.println("** 跳转之后...");
%>
http://127.0.0.1:8080/test/base/05/responseDemo03.jsp?upass=123 并没有传参
responseDemo04.jsp
<%@page contentType="text/html;charset=gb2312"%>
<h1>欢迎光临:responseDemo04.jsp</h1>
<h1>upass :<%=request.getParameter("upass")%></h1>
<h1>uname :<%=request.getParameter("uname")%></h1>
服务器输出:
****跳转之前
****跳转之后
原因: response.sendRedirect(“responseDemo04.jsp?uname=ZTE”); 只是将控制信息设置在协议头,但客户端并不进行跳转,因此在执行完jsp组件内容后将结果信息返回到浏览器并完成跳转
13、把数据往外存存,效率降低
数据量很大,数据库中的列是有限的,并发率高,可以使用redis,使用内存存储
《考试》
14、超链接和表单的相同点不同点
相同点:
1)都是前台技术
2)都能自动产生http请求
不同点:
1)超链接只能是get请求
表单可以是post,也可以是get
2)表单更容易和用户进行交互
3)超链接容易写
4)当需要安全并且和用户交互时,使用表单
当只需要完成一项功能,不需要和用户交互时使用超链接
《考试》
15、简述/说明:服务端跳转和客户端跳转的相同点和不同点及使用擦行和
1.相同点:从一个页面跳转到另一个页面
2.不同点
1)语法不同:
客户端:reponse.sendRedirect()重定向
服务端:request.getRequestDispatcher().forward(request,response)
2)执行机制不同:
客户端:服务器向http协议头设定控制信息,真正跳转的是浏览器
服务端:由服务器完成的跳转
3)
客户端:服务器执行完跳转语句之后,之后的代码要执行
服务端:后面的代码不执行
4)
客户端 :由浏览器重新发请求,在浏览器中地址栏会变化,重新发请求
服务端:不发生
5)传递参数
客户端:不能将参数从一个组件或页面传到另一个页面,因为是浏览器器跳转
服务端:能传递参数
6)重新传参
客户端:可以重新传参,因为是重新发请求
服务端:不能重新传参
3.各自的使用场合:
服务端应用到正常流程
客户端应用到异常流程
cookie(作为识别session的重要手段)
1.cookie的数据结构是有唯一key->value的map结构
2.作用:
(1)(用户cookie)把本应由服务器保存的敏感信息以cookie的形式保存在客户端(不安全;占用用户
硬盘空间)
(2)利用系统cookie识别用户的session
3.工作位置:cookie在客户端
4.request存放信息:
(1)请求字符串
(2)请求参数
(3)IP地址
(4)客户端所有cookie
5.用户cookie
(1)创建Cookie对象存放用户的敏感信息数据 name= zs,value=123 可对Cookie对象设置保存时间
(2) 请求结束时通过response将Cookie信息回传给http协议
(3) request通过http协议取得保存的Cookie信息
生存时间设置:c1.setMaxAge(60);
6.系统 cookie
7.cookie使用不当会造成空指针异常
原因:没有cookie,c.length处产生空指针异常。请求没正常结束,没有任何信息给浏览器,不会把
新的cookie发给客户端。
8.刷新页面还会出现空指针异常么?
会!
出现异常时,请求没有正常结束,请求没有Cookie信息回传给浏览器。
9.设置Cookie
如何将用户的敏感信息存放在数据库中
1.用数据库服务器
2. 维护数据库
节省成本的方式:
通过response将用户敏感信息封装在Cookie中,重新发送给浏览器保存
作业:
保存用户名密码在Cookie中,下次访问可以不登录不再需要重新输入密码。
session.isNew();
session.invalidate(); //注销session
Long 11=Session.getCreationTime()//获得session的创建时间
Long 12=session.getLastAccessTime()//获得session最后一次的访问时间
model view control
模型层,视图层,控制层(业务层,持久层逻辑javabean)
Model1(视图层,控制层)
缺点:可维护不好;移植性不好;健壮性不好
解决容易出现空指针异常的方法:(幽灵异常)model1–>model2
1 健壮性太差,只要把视图层和控制层分离就能解决,改变为mvc模式
2 表单里数据不可能为null,即使没有输入也是空串,不会产生空指针异常,
所以用表单username.equals(“pansy数据库”)&&”admin”.equals(password);
区别于”pansy”.equals(username)&&”admin”.equals(password);
为什么要用MVC设置模式
接收,分析,分发请求。
分离视图层和控制层,能解决空指针异常。
不用数据库存储,用文件存储。(高数据,高并发,高安全达不到要求)
数据库的缺陷
高数据 高并发 高安全
request.getRequestURI( );
targe = \pansy\application.jsp
分析请求字符串取得项目的虚目录
targe.indexof(‘\’,1);
targe.subString(0,6);
(3)到servlet文件中通过虚项目名找到真实路径
通过”\pansy”在servlrt.xml取得真实目录
<%@ page contentType="text/html;charset=gbk"%>
<h1>取得虚目录的真实路径</h1>
<h1><%=this.getServletContext().getRealPath("/")%></h1>
<h1>取得组件的绝对路径</h1>
<h1><%=application.getRealPath("hello.jsp")%></h1>
一、javaBean种类
二、JavaBean的优点
三、表单Bean
a. 包声明:规定类的字节码文件需要在当前规定下才可以被使用
b. public 定义一个主类
主类中不一定有主方法
c. 属性必须封装 (private)
属性名、个数、类型与表单一致
d. 命名规范
e. 提供public方法调用属性
f. 显示提供无参的构造方法