javaweb课堂笔记(二)

一、多值请求

通过表单、地址栏、超链接发数据
下例是直接分析地址栏:

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、为什么复选框一定要选值?

  • 文本框中未输入选项时,参数为空串
  • 复选框未选中提交时,参数为null,后台处理时报错出现空指针异常

该请求的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参数名对应的值。
在这里插入图片描述

二、response

9、response作用:

  1. 返回结果信息给浏览器
  2. 设置http协议头,控制浏览器自动发请求(定时刷新,定时跳转)
  3. 客户端跳转(时间间隔为0)
  4. 设置cookie 记住用户信息
    (将用户的敏感信息封装成cookie,通过response向http协议发送cookie,节省服务器资源)

10、定时刷新

 http://127.0.0.1:8080/test/base/05/responseDemo00.jsp
  1. 浏览器发送请求,Tomcat创建request接收参数,执行responseDemo00.jsp
  2. 浏览器拿到结果信息,通过http协议头拿到控制信息,浏览器自动访问控制信息
    浏览器根据服务端组件向response设定的控制信息发送请求,并不知道自己发送了几次请求
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

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

  1. 用户第一次发请求访问CookieDemo01.jsp,Tomcat为用户创建session,在创建了Session的同时,服务器会为该Session生成唯一的SessionId
  2. 在创建Cookie对象时,Tomcat自动创建系统Cookie对象保存sessionId
  3. response通过http协议回传系统Cookie给浏览器

7.cookie使用不当会造成空指针异常
原因:没有cookie,c.length处产生空指针异常。请求没正常结束,没有任何信息给浏览器,不会把
新的cookie发给客户端。
8.刷新页面还会出现空指针异常么?
会!
出现异常时,请求没有正常结束,请求没有Cookie信息回传给浏览器。
9.设置Cookie
如何将用户的敏感信息存放在数据库中
1.用数据库服务器
2. 维护数据库
节省成本的方式:
通过response将用户敏感信息封装在Cookie中,重新发送给浏览器保存

作业:
保存用户名密码在Cookie中,下次访问可以不登录不再需要重新输入密码。

流程图
在这里插入图片描述
在这里插入图片描述

四、session:

  1. 生命周期:用户第一次发请求访问动态组件时创建,用户下线后900s时被释放。
    作用:标识用户在服务器的存在;传递验证信息
  2. 关闭session的方式:
    用户下线session不一定销毁 session监听器可以设置关闭浏览器关闭session
    1)通过服务器强行关闭session(最有效)
    2)session.invalidate()后台强行驱逐(eg.管理员踢出)
    3)设定seseion的生存时间,在配置文件里面设置
  3. 获取sessionId
    由Tomcat自动分配和获取,也可以通过session.getId();获取
  4. 如何判断新用户?
    Tomcat可自动判断, 通过调用session.isNew();
    注意: 第一次发送请求访问jsp组件不等于用户第一次访问jsp组件
    重启Tomcat,第一次发送请求访问jsp组件,Tomcat不为其创建系统Cookie,request不为Cookie创建数组对象,Tomcat调用session.isNew();查找该用户的sessionId是否存在判断其是否为新用户,若为isNew==ture,Tomcat为用户创建session,同时服务器会为该session生成唯一的SessionId
    第二次访问jsp组件时,为旧用户。当后台注销session后访问jsp组件,sessionId在注销后15分钟内仍然存在,存在系统Cookie,判断其为旧用户。注销session之后的每一次访问都为新用户。session.invalidate(); //注销session
  5. cookie与session:
    不同点:
    Cookie:存放用户的敏感信息,客户端工作
    Seesion:存放用户的验证信息,服务端工作
    Tomcat通过用系统Cookie找到该用户对应的session
    相同点:
    都和用户相关
  6. Session生存时间的设定
    Long 11=Session.getCreationTime()//获得session的创建时间
    Long 12=session.getLastAccessTime()//获得session最后一次的访问时间

五、MVC设计模式

  1. model view control
    模型层,视图层,控制层(业务层,持久层逻辑javabean)

  2. Model1(视图层,控制层)
    缺点:可维护不好;移植性不好;健壮性不好

  3. 解决容易出现空指针异常的方法:(幽灵异常)model1–>model2
    1 健壮性太差,只要把视图层和控制层分离就能解决,改变为mvc模式
    2 表单里数据不可能为null,即使没有输入也是空串,不会产生空指针异常,

    所以用表单username.equals(“pansy数据库”)&&”admin”.equals(password);
    区别于”pansy”.equals(username)&&”admin”.equals(password);

  4. 为什么要用MVC设置模式
    接收,分析,分发请求。
    分离视图层和控制层,能解决空指针异常。
    不用数据库存储,用文件存储。(高数据,高并发,高安全达不到要求)

  5. 数据库的缺陷
    高数据 高并发 高安全

六、application

  1. 创建application:
    class Myclass implements ServletContext
    ServletContext application = new MyClass();
  2. 怎么拿到虚目录的物理路径:
    (1)从request内置对象中拿到请求字符串
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>
  1. out
    (1)不规范,难以维护
    (2)主要用于动态向客户端输出数据
    (3)在输出信息之后不会消失
  2. config
    存放web配置信息的参数,服务范围

七、javaBean

一、javaBean种类

  1. 数据Bean(Pojo)
    a. 表单Bean actionform
    作用:用于收集封装表单数据
    要求:表单Bean的属性名、个数、类型与表单内属性名、个数、类型一致!
    b. 结果Bean 实体类
    作用:收集封装数据库查找的结果信息
    要求:结果Bean属性名、个数、类型和记录的字段一致
  2. 逻辑Bean
    a. 业务Bean 即业务层(核心技术)
    作用:对请求进行处理
    b. 持久Bean 即持久层,数据访问层DAO
    作用:封装对数据库的操作

二、JavaBean的优点

  1. 自动收集和封装
  2. 提高代码的复用性
    对于通用的事务处理逻辑,数据库操作等都可以封装在JavaBean中,通过调用JavaBean的属性和方法可以快速进行程序设计。
  3. 分布式运用
    多用JavaBean,尽量减少Java代码和Html的混编。
  4. 提高代码的执行效率和可维护性

三、表单Bean

a. 包声明:规定类的字节码文件需要在当前规定下才可以被使用
b. public 定义一个主类
主类中不一定有主方法
c. 属性必须封装 (private)
属性名、个数、类型与表单一致
d. 命名规范
e. 提供public方法调用属性
f. 显示提供无参的构造方法

  • 11
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值