javaweb课堂笔记(二)

本文深入讲解Web开发核心概念,包括多值请求处理、HTTP响应控制、Cookie与Session机制、MVC设计模式、Application作用域及JavaBean应用。涵盖从前端到后端的全面技术要点。

一、多值请求

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

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
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值