Java笔记(9)

JSP 存在两种 开发模式

Model1 : JSP + JavaBean

* 不适合开发业务逻辑特别复杂web应用 ----- 业务逻辑复杂,控制代码多,而在jsp中编写控制代码,十分不便

Model2 : JSP + JavaBean + Servlet

符合MVC设计模式

JSP(View视图功能):负责页面显示

JavaBean(Model 模型功能):负责数据封装和处理

Servlet(Controller 控制器功能):连接模型和视图,对整个业务流程进行控制,调用JavaBean封装处理数据,调用JSP显示页面

MVC模式 、JavaEE体系结构三层架构 关系?

三层架构:web层、业务层、数据层

MVC : Model 、View 、Controller

业务层和数据层 --- Model

web层 Servlet ---- Controller

web层 JSP ---- View

model1 分工

JSP 负责页面显示,跳转,调用JavaBean

JavaBean 封装和处理数据

什么是JavaBean?

1、是一个Java 类

2、必须存在无参数构造方法

3、所有成员变量都是private

4、如果想private成员变量被外界访问,提供public的get和set方法

单例?

1、private 构造方法

2、private static 实例对象

3、public static 对象访问方法

JavaBean属性

1、必须小写字母开始 name 、age 合法的, City 是不合法属性 ---- 规范的

2、每个属性可以提供public的getter和setter方法

* 命名规则:属性name ---- 方法getName 、setName

将属性首字母大写,在属性名前拼接get或set

在JSP规范中,提供三个与JavaBean相关 动作标签

<jsp:useBean>

<jsp:setProperty>

<jsp:getProperty>

<jsp:useBean id="person" scope="page" class="cn.itcast.javabean.Person"></jsp:useBean>

翻译为

cn.itcast.javabean.Person person = null;   ----- 创建Person对象 null

synchronized (_jspx_page_context) {

person = (cn.itcast.javabean.Person) _jspx_page_context.getAttribute("person", PageContext.PAGE_SCOPE); ---- 获得page范围person属性

if (person == null){  ----- 判断获得person对象是否为null

person = new cn.itcast.javabean.Person();  ----- 如果person对象为null,创建新的对象

_jspx_page_context.setAttribute("person", person, PageContext.PAGE_SCOPE); ---- 将创建person放入page范围

}

}

代码效果:从page返回获得person对象,如果不为null 直接使用,如果为null 创建新的Person对象

* 因为实际开发中,主要应用model2,所有javabean相关标签已经很少使用

setProperty特殊用法

<jsp:setProperty property="*" name="person" />  ---- 根据请求数据自动封装 Person属性

* 因为model2 ---- 该标签也不经常使用

Model1案例:计算器

1、输入字母 -- 报错

2、精度问题

非法数据 ---- 有效数据校验(客户端校验JS ,服务器端校验) ------ 服务器端校验必须的

通过 JavaScript在客户端 校验数据合法性

1) 将被校验数据 添加 id属性

2) 在form标签中 添加 onsubmit函数  ----- onsubmit="return checkForm();"

3) 通过 JS编写 checkForm函数

取得校验字段值 document.getElementById(id).value

精度问题 : java.math.BigDecimal

add(BigDecimal augend)

subtract(BigDecimal subtrahend)

multiply(BigDecimal multiplicand)

divide(BigDecimal divisor, int roundingMode)

* 1/3 使用 BigDecimal会报错 ---- 四舍五入

什么是内省?为什么学内省?

JDK提供一套JavaBean操作API ,对JavaBean通过反射技术操作,内省是一套基于反射技术,更便于操作JavaBean API 。

JavaBean属性计算方法 ?

1、通过Introspector获得 JavaBean 类相关信息

2、通过BeanInfo 获得方法描述器和属性 描述器

getMethodDescriptors()

getPropertyDescriptors()  ----重点

JavaBean属性不是同成员变量计算的,是通过get和set方法计算

例如:getName ----- 去掉get将 Name首字母小写 ---- name属性

setAge ---- 去掉set 将Age的首字母小写 ---- age属性

* 每一个对象继承Object,继承getClass()方法 -- 得到class属性

将Map的key 与 JavaBean对象属性进行匹配,自动将value保存到对象中  ---- 内省应用

* <jsp:setProperty property="*" /> 原理

在Model1中,完成form参数 ---- JavaBean自动封装

<jsp:setProperty property="*" name="calculator" />

在Model2中 不可以使用 jsp标签,在Servlet中完成 将form数据 封装 javabean对象

使用内省技术(基于反射,方便操作javabean API )完成form数据 封装 javabean对象 -------- 内省在编写代码上复杂

BeanUtils 工具包 (完成对javabean封装操作)

BeanUtils一套开发包,Apache公司提供 ,专门进行javabean操作,在web层各种框架中 被使用 例如:struts 使用BeanUtils操作JavaBean

采用BeanUtils编写快速入门案例

1、下载BeanUtils的jar :commons-beanutils 、commons-logging

BeanUtils依赖 Logging的jar包

2、将beanutils和logging的 jar包复制 工程/WebRoot/WEB-INF/lib

3、编写BeanUtils的封装程序

BeanUtils.populate(person, request.getParameterMap());

如果在Person类添加特殊类型Date类型,对于特殊类型如何封装 ?

1、自定义转换器 ---- 需要实现Converter接口

2、在调用populate方法前,注册转换器

ConvertUtils.register(Converter converter, Class clazz)

结论:

1、如果form参数是String类型,javabean属性String类型 ---- 调用BeanUtils.populate 将form数据封装 javabean

2、如果JavaBean属性类型不是String ---- 将form数据封装javabean 需要转换器 ----- 在BeanUtils API 提供很多默认转换器(完成常见转换)

3、如果需要转换类型非常特殊,可以通过自定义转换器完成 定义类实现Converter接口,实现convert方法 ,在populate调用之前通过ConvertUtils.register注册转换器

Model2: JSP + JavaBean + Servlet 职责分工

JSP 页面显示

JavaBean 封装数据 处理数据

Servlet 控制整个处理流程,调用JavaBean,调用JSP

MVC设计模式

软件开发23种标准设计模式 ---- 解决问题方法

MVC不属于 软件23种设计模式

MVC架构模式 将web应用资源分为三个部分 : Model、View 、Controller 分工明确

为什么要使用MVC? 分工明确,便于维护

----------------------------------------------------------------------------------------------------

基于model2 案例:用户注册和登陆

1、将用户信息保存xml文件中 ----- xml文件读写 XML PULL

2、注册: 将用户信息写入xml --- xml增加节点操作  ----- 一次性验证码

3、登陆:XML中节点查询 ------ 记住用户名和密码

注册功能:regist.jsp页面(注册form) ----- RegistServlet ---- 封装数据User ---- 将User信息写入XML UserModel ---- 注册结果页面

1、创建 web工程 day09user

2、导入jar包 xpp3.jar beanutils.jar logging.jar 复制WebRoot/WEB-INF/lib

3、创建package结构

公司.部门.项目.分包  例如:cn.itcast.user.分包

因为工程采用MVC架构

cn.itcast.user.controller

cn.itcast.user.model

cn.itcast.user.view

cn.itcast.user.utils

编写注册功能:

regist.jsp ---- 规定一些user有哪些数据 ?用户名、密码、邮箱、验证码 --- 引入验证码图片 --- 点击切换效果

RegistServlet 控制器

User 存放数据JavaBean

UserModel 处理数据JavaBean ---- 使用pull解析器 将数据写入xml *** 将xml中数据解析 List对象,将List对象数据序列化Xml

注册成功 跳转 login.jsp

编写登陆功能

login.jsp 登陆form

LoginServlet 控制器

User 封装数据

UserModel 进行登陆处理

成功 --- 跳转index.jsp

失败 --- 跳转login.jsp

用户注销 ---- 原理注销session

记住用户名和密码

原理:向客户端写cookie信息

什么情况下 需要记住用户名和密码:1、用户勾选记住checkbox 2、登陆成功

* 自动登陆 --- Filter

cookie文件不能保存中文!!!

解决:手动对中文编码写入cookie,读取cookie时,进行手动解码

练习:在注册页面验证两次密码是否一致 JavaScript

练习任务:

1、计算器

2、用户登陆注册

理论:什么JSPmodel1 和 model2 、MVC

Java笔记(9),布布扣,bubuko.com

时间: 2024-09-30 09:03:35

Java笔记(9)的相关文章

15.1-全栈Java笔记:Java事件模型是什么?事件控制的过程有哪几步??

应用前边两节上一章节的内容,大家可以完成一个简单的界面,但是没有任何的功能,界面完全是静态的,如果要实现具体功能的话,必须要学习事件模型. 事件模型简介及常见事件模型 对于采用了图形用户界面的程序来说,事件控制是非常重要的. 一个源(事件源)产生一个事件并把它(事件对象)送到一个或多个监听器那里,监听器只是简单地等待,直到它收到一个事件,一旦事件被接收,监听器将处理这些事件. 一个事件源必须注册监听器以便监听器可以接收关于一个特定事件的通知. 每种类型的事件都有其自己的注册方法,一般形式为: v

13.1-全栈Java笔记:打飞机游戏实战项目|AWT技术|MyGameFrame

简介和项目目标 通过游戏项目学习整个Java基础知识体系,我们做了精心的设计,让每一章知识都能获得应用. 比如:多线程用来实现动画效果.容器实现对于多发炮弹的存取和处理.常用类等等的应用. 寓教于乐,让大家迅速入门,更希望通过喜闻乐见的小游戏,让大家爱上编程,爱上"程序员". 老鸟建议 很多朋友会疑惑:"游戏项目,又不能拿到企业面试中,为什么要讲?" 这是一种太过于功利的想法.就像,我们说:"今天吃个馒头,又不是长高,为什么要吃呢?" 游戏项目的

Java笔记---部署 JavaWeb 项目到云服务器

一.前言 前面我们已经尝过了在云服务器上部署代码的甜头了,现在主菜就要上场了,那就是将我们的 JavaWeb 项目部署到云服务器上.兴奋吧?淡定淡定~ 二.项目部署 我们对于 Java Web 项目在本地机器(无论是 Windows 还是 Linux)上的部署已经了然于心了,那么对于在云服务器上部署 Java Web 项目又是如何操作的呢? 其实很简单,还是离不开 Web 项目部署的那三点: ① 基础的 JDK 环境 ② 一个 Web 服务器.如 Tomcat.JBoss ③ 一款数据库.如:m

JAVA 笔记 七

JAVA笔记七 this:就代表本类的对象,this代表它所在函数所属对象的引用简单说:那个对象在调用this所在的函数,this就代表那个对象静态:static 用法:是一个修饰符,用于修饰成员(成员变量,成员函数)当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用.类名.静态成员static特点1.随着类的加载而加载2.优先于的对象存在3.被所有对象所共享4.可以直接被类名所调用实例变量和类变量的区别:1.存放位置. 类变量随着类的加载而存在与方法区中. 实例

JAVA笔记六

JAVA笔记总结六 把大象放入冰箱的几步: 面向对象的三个特征:封装,继承,多态 JAVA开发实际上就是找对象使用,没有对象就创建一个对象 找对象,建立对象,维护对象的关系 类和对象的关系:类是对现实生活中实物的描述: 对象就是这类事物,实实在在存在的个体 匿名对象:匿名对象可以作为参数进行传递也可以作为对象方法进行一次调用

java 笔记 String 和Stringbuffer

String 是一个类,而不是java中的基本数据类型. String s = "abc";  "abc"是一个对象,存放在常量池中.一旦被初始化就不能被更改了. s = "cde";  这里并没有改变字符串,而是使对象引用指向字符串cde: String s1 = new String("abc"); String s2 = "abc"; 这两者有什么不同,第一个有两个对象,一个是"abc&qu

14.5-全栈Java笔记:java.awt这些布局怎么写?|流式|边界|网格

布局管理器 读者会发现,如果使用坐标定位法(空布局),在一个比较复杂的界面上定位每个控件的坐标是一个非常麻烦的工作,而且在界面大小发生改变时,控件的绝对位置也不会随之发生改变.那么如果我们想让用户界面上的组件可以按照不同的方式进行排列怎么办?例如:可以依序水平排列,或者按网格方式进行排列等,其实每种排列方案都是指组件的一种"布局",要管理这些布局,就需要本节学习的布局管理器. 管理布局的类由java.awt包来提供,布局管理器是一组实现java.awt.LayoutManager接口的

14.4-全栈Java笔记: javax.swing常用控件有哪些?怎么用?

常用基本控件 javax.swing.JButton 在图形界面程序中,按钮可能是使用量最大的控件之一,javax.swing包中JButton类就是用来创建按钮的.如表1所示,为JButton常用的构造方法.  javax.swing.JLabel JLabel控件是最简单的Swing组件之一,用于在窗体上显示标签, JLabel既可以显示文本,也可以显示图像.如表3所示,为JLabel常用的构造方法. 注意: JLabel只能用于显示文本和图标信息,用户不能对其进行修改. javax.swi

13.3-全栈Java笔记:打飞机游戏实战项目|PaintThread|launchFrame

多线程和内部类实现动画效果 1)增加绘制窗口的线程类 前三个版本,我们步步为营,每个小版本都有功能的突破.但是,目前为止我们的窗口仍然是静态的,并没有像真正的游戏窗口那样"各种动.各种炫".本节我们结合多线程实现动画效果. 我们在MyGameFrame类中定义"重画窗口线程PaintThread类",为了方便使用MyGameFrame类的属性和方法,我们将PaintThread定义成内部类. [示例1]MyGameFrame类:增加PaintThread内部类 pu

4.6-全栈Java笔记:THIS关键字和STATIC关键字

this关键字 对象创建的过程和this的本质 构造方法是创建java对象的重要途径,通过new关键字调用构造器时,构造器也确实返回了该类的对象,但这个对象并不是完全由构造器负责创建的.创建一个对象分为如下四步: 1. 分配对象空间,并将对象成员变量初始化为0或空 2. 执行属性值的显示初始化 3. 执行构造方法 4. 返回对象的地址给相关的变量 this的本质就是"创建好的对象的地址"!  由于在构造方法调用前,对象已经创建.因此,在构造方法中也可以使用this代表"当前对