我的刘老师jsp笔记

三层架构
三层架构主要分为以下几个,

  1. dao层 所有的数据库操作,或者是数据加载都由他来完成。
  2. service层,业务层,我们目前的jsp的业务较低的情况之下,通常都是一个dao的方法对应一个service方法。但是在实际使用当中,可能会在service有进一步的修改。
    a) 显示数据为例,比如说我们需要把数据库的个人信息加载到view层
    那么拿取数据的操作就应该是dao来做。
    个人信息部分拿取不难,但是在显示的时候,有一些敏感数据肯定是需要做一些简单的处理。
    假设身份证只显示最前三位和最后四位,其他的使用*号代替
    dao是做数据扒取的,不适合做数据的再次加密,
    view只是显示数据的环节,这个工作只能交由给service。
  3. 显示层 (view层)

为什么需要三层?
我们使用三层,实际上是因为我们之前使用的代码都是一次性代码,没有任何复用的可能性。
三层是不关系显示层的。这就需要大家在写代码的时候,进行的降低耦合。

我们在实际使用三层的注意事项:

  1. 为什么要用接口
    a) 我们当时都会在每个dao之前先写一个Idao的接口,能不能省掉呢?
    我们之后的开发,一般都有专门的人去把数据库(dba),专门有人搭建框架(项目的主要技术和主要结构)架构师,专门有人订制功能(项目组长),项目组长写出接口确定功能,就有我们这些码农进行实现。
  2. 关于BaseDao
    a) 连接池,现在主流几乎所有的框架都会有连接池,我们书本连接池挺简单的。
    在后面的框架里面再着重讲解。
    b) 我们一般都是把它做成一个父类,接口的实现类对BaseDao进行继承。也可以接口实现类直接new BaseDao。
    为什么会用继承,实际上是代码的关系,以后类似于BaseDao的相关操作肯定是由组长完成
  3. 每一层级的命名,接口的包可以使用dao||idao 作为命名
    后续的实现类 使用 impl作为每层的实现
  4. 我们的PageHelper类(分页助手),放在哪里呢?
  5. 一定不能跨层级访问,上层不能直接访问下层。
  6. 所有的上层,都应该做成是有返方法,利用返回值给下层提供数据。
    a) 主流 List ,Map<,> 拿取多个数据
    实体类(单个对象),
    int(判断数据时候增删改成功或者是是否存在),
    string(单一某一个列的某一个数据)
    tomcat
    我们现在做的项目实际上都是网页项目,我们就需要一个容器帮我们把项目部署,我们可以通过地址去进行访问.不仅免费,可以支持上古的巨兽 servlet 跟 jsp的特性.
    session,请求 响应 这些都是跟tomcat息息相关.

我的习惯都是下载绿色版本的tomcat,不需要安装,解压即可以使用.
准备工作

  1. tomcat版本与jdk版本息息相关
    a) 如果你的tomcat跑不起来,去检查一下你的jdk是否配好环境变量
    b) 怎么测试tomcat是否可以运行, 在tomcat/bin/startup.bat 访问localhost:8080
    c) tomcat版本如果是7的话 jdk就至少要是7以上
  2. 实际上我们使用tomcat很少会直接在文件夹里面进行使用,一般都会直接把tomcat部署到开发工具里面 MyEclipse/ Eclipse
    a) MyEclipse  属性  搜索tomcat  一般来说开发工具都会有自带的tomcat
    我们就把已经解压到电脑的tomcat 文件夹地址放置过来
    把自带的tomcat设置为 Disable (禁用)
    导入的tomcat设置为 enable(使用)

tomcat由什么组成
在这里插入图片描述
bin文件夹
包含有启动/关闭tomcat的脚本 startup.bat windows 启动 startup.sh Linux启动
设置环境变量,路径都是依赖这个文件夹.
conf文件夹
tomcat-user.xml 设置用户的角色 ,管理员的信息
web.xml 设置默认的欢迎页面, 设置会话时长

30

可以在这里面设置过滤器监听整个tomcat容器
server.xml

  1. 提供tomcat初始组件的配置
  2. 说明整个tomcat的结构,含义,部署初始组件

    context.xml
    旧的版本的tomcat是没有
    代表了运行在虚拟主机上的单个web应用,这个配置文件主要是用来配置数据源之类的作用.

lib文件夹
专门放置jar的文件夹,一般我们都是把项目直接在开发工具里面部署,然后把jar放在项目木的lib包里面.
放在tomcat的lib文件夹下的好处,整个tomcat容器里面的所有项目都可以使用,
如果项目不是通过开发工具部署,而是直接复制到tomcat里面的时候,也需要把jar放入到这里.

logs文件夹 (可以清空)
专门放置日志文件,但是一些重要的信息还是会在开发工具里面显示.
temp文件夹 (可以清空)
临时文件夹
缓存和临时文件

webapps文件夹
专门放置web应用的目录,你如果想让你的web跑起来,就必须放置在这里面,

  1. 可以通过开发工具部署过来,
  2. 也可以自己把项目放置到这里. 一定是已经编译过的项目
    新版本显示的是一个wtpwebapps的文件夹.

work文件夹 work工作空间 (可以清空)
存放有各个web项目生成的.java/class的文件
项目部署好了之后,我们第一次访问的时候会生成,
后续再次访问的时候,就不需要生成,而用户一直访问的文件,实际上就是这个工作空间.

注意事项:
一般大家发现写了新的代码部署之后,效果不出来,有可能是webapps更新了
但是work文件没有更新造成的.
清空没有更新的work文件夹/下面的项目,再次访问查看

tomcat哪些地方可能需要修改

  1. 如果修改我们的端口号:
    a) conf文件夹/sever.xml/

    port 修改端口号
    connectionTimeout 连接时长

b) URIEncoding = "UTF-8"修改我们的编码字符 我们已get提交方式的编码
2. 修改tomcat最大连接数
tomcat有一行注释 是专门设置 tomcat最大的连接数

a) 把上述这一行取消注释
b) 就要在设置端口号的地方 加上一段代码

c) 这个最大的连接数实际上的操作过程就是多线程,无论是单核还是多核的电脑都可以利用多线程做出类似并发的操作。
3. 发布项目到tomcat,有多少种形式
a) 依赖开发工具,帮我们把项目部署到容器里面,最简单。仅需要查看webapps文件夹即可以查看是否部署成功。
b) 直接把打包好的项目,放在webapps文件夹里面。tomcat在跑的时候会自动部署。
我们以后开发项目的设备和运行项目的设备肯定不是同一个,因为我们会专门部署到服务器,热修改。
c) 不把项目文件放置到tomcat, 通过Catalina文件夹来进行配置, conf/ Catalina/localhost文件夹下,通过配置文件(创建一个xml),该文件的名字就是站点的名字。引导。
4. tomcat是如何创建servlet的实例
a) 当容器在启动的时候,会读取webapps目录里面每一个项目的web.xml,对每个web.xml进行解析,会读取servlet注册信息.
b) 将每一个web应用里面面的servlet进行加载,并通过反射的方式对servlet进行实例化。
c) 在servlet注册时如果为正数,则一开始就实例化,如果不写或者为负数,则第一次请求的时候实例化。

请求与响应
请求和响应是我们B/S架构特有的.
一次请求对应一次响应。
jsp的脚本
我们的jsp本身是类似于html的结构,我们在使用的时候,会在jsp里面添加各种的java代码。
<% %> 需要用这个标签嵌套所有的java代码。

  1. @ 代表引用
  2. !声明方法
  3. = 代表输出
  4. 如果没有上述符号,代表单纯的逻辑代码。

请求
请求是为了发送数据到服务器上,无论是表单还是控件甚至是超链接,我们都可以发送数据出去。我们尝试在A页面发送,B页面进行提取。

示例,发送表单请求
在这里插入图片描述
获取request发送的请求数据
request.getParameter(“控件的name”)获取对应的控件的value值。

如何获取多个数据
拿取数据的时候

  1. 上面所说的拿取单个数据
  2. 拿取多个数据,同name情况下,有多个数据 通常在多选按钮。
    request.getParameterValues(“控件的name”)可以获取同一个name的多个数据
    返回的类型是string[ ]
  3. 超链接
    扩展1
    A页面发送请求的时候,实际上是经过什么环节,我们打开B页面的时候才能够拿到数据。
    tomcat帮了我们很大的忙,
    tomcat里面有一个模块service,这个service模块里面,
    其中有一个组成部分叫做Connector组件
    类似于一个桥梁的作用,它来帮我联通了页面  服务器  客户端之间的连接。
    之后无论是生成servlet,还是编译成.class文件。

示例 超链接发送数据
使用超链接发送数据的次数,肯定会比表单要多,
查询的内容,分页信息,查看个人信息的数据.
超链接发送数据的时候,实际上是依赖网址进行传输。
优点 : 简单,无需写完整的表单也可以发送多个数据。
例子: <a href=”default.jsp?参数名=参数值&参数名2=参数值”>
在网址后面追加一个问号,然后以键值对的形式拼接数据,多个数据间以& 符号拼接。

拿取超链接数据的时候,依旧是使用request对象拿取。
使用request对象的getParameter(“参数名”)拿取参数值。

缺点:

  1. 不利于传输重要的数据,因为数据会在网址上显示。
  2. 网址的长度是有限制的,传输大量的信息可能会出现丢失。

示例 Attribute
如果在操作几个页面的时候,都不能够使用表单,数据也比较重要没有办法使用超链接。
某一些数据不想让用户知道,但是我还是要在用户不知道的情况之下,发送某些重要的数据。

reques.setAttribute(key,value)存储数据 然后可以在第二个页面使用。

在第二个页面 request.getAttribute(key)获取数据

Attribute存储的数据只能够在一个生命周期里面存活。
弊端:只能在一次转发里面保留数据,A页面发送之后,B页面又跳转到C页面
C页面我们是没办法获取Attribute数据。
转发跟重定向
转发: 小王打电话给电信部门投诉,电信部门告诉他这个不归他们管,让他打某一个电话。
小王就需要挂电话之后才能重新打投诉电话。
重定向:小王打投诉电话,A不知道怎么解决,让小王不要挂电话,A找B接这个电话来处理。B在这通电话里面帮你解决。

在这里插入图片描述

Response响应对象,主要是将jsp容器处理后的结果返回到客户端,可以通过response变量设置向客户发送的数据,。

session的作用在哪里?
request在转发的时候,数据可以跳转到第二个页面.
request里面的数据在重定向之后无法拿到.

假设如果按照我们之前的操作,A页面时购物车的,B页面是支付的页面,通过超链接跳转,我在B页面支付的时候,能不能拿到我在A页面购物车的数据?
为什么拿不到?
因为HTTP协议是一个无状态的协议,我从购物车跳转到支付页面,因为是无状态的协议,所以服务器压根不知道我是谁,也无法得知是谁买了东西要支付。
session就是为了跟踪,给每一个访问上来的用户(不管是否有登录) 一个特定的标识,标注好每一位访问的用户,这样子我们才可以在HTTP协议之下,服务器才能根据每个人的请求,返回每个人请求后响应的数据。sessionID。
关于session的几个问答

  1. seesion由谁创建?
    session是由服务器创建,当我们浏览器发送请求给服务器的时候,服务器接收到请求之后,servlet进行处理的时候,就会创建session。
    tomcat创建
  2. session存在哪里?
    是在服务器的内存里面去创建,传输的速度较快,但是缺陷也有,不好保存。
  3. session的生命周期?
    一般在特定的时间内,我们可以在原浏览器再次打开网址能够访问到同一个sessionID,包括浏览器的子窗口,
    虽然session保存在服务器上面,但是对于客户端来说是透明。
    一般服务器都会有默认的session失效的时长,tomcat(30min)
    (创建session只有在访问jsp,servlet才会创建session,一般的访问静态页面或者是静态资源不会创建session)

session实际应用
session配合JavaBean和三层提取数据
前期准备工作,要操作数据库,mysql的jar导入
项目右键  属性  javabuildPath add jar导入mysql jar包

我现在要做的事情是连接数据库把输入正确的账号和密码,拿到用户id。

  1. BaseDao 连接数据库工具类
    a) 连接数据库 为了返回Connection对象
    温馨提醒: 所有关于jdbc操作要导的包,都是java.sql
    i. 加载驱动 Class.forName(“com.mysql.jdbc.Driver”)
    ii. Connection conn = DriverManager.getConnection(“jdbc:mysql://localhost:3306/newsdb?characterEncoding=utf-8”,“root”,""); 创建连接数据库对象
    iii. return conn 返回对象
    b) 关闭资源 关闭ResultSet pre conn
    i. 判断每个对象是否为空,如果为空则关闭对象

  2. 创建完BaseDao之后,就要根据业务需要创建对应的操作接口,
    你有多少张表,就至少要有多少个操作接口。
    有多少个操作接口,尽量保持多少个实体类,更好的利用泛型。
    a) 在定义接口的时候,最麻烦的是返回值类型。
    i. 返回单个值 , 查是否存在 我们可以用数字代替 int count(1);
    查询某一个类的单个值, String object
    ii. 返回多个数据 (多行数据),返回一个泛型/集合
    如果返回的数据是几张表的数据结合,

  3. 要不就改写实体类,把其他实体类的属性复制过来。 泛型/集合/键值对

  4. 新建一个新的实体类 ,就是为了给该功能服务。管理方便。ArrayList
    返回多个值 (单行多个列数据) 返回值类型  实体类的对象
    像一些需要持久使用的数据,我建议还是使用返回对象的方式
    登录之后 返回用户的信息 ,而不是单纯判断该用户是否存在
    加入购物车的商品,我们无论是什么时候都要得到数据。

  5. 下一步 创建接口的实现类
    a) 对接口方法进行实现
    i. 调用父类的连接数据库的方法
    ii. 拼接sql 使用该方法拼接 conn.prepareStatement()
    iii. 如果是查询 则使用executeQuery()方法返回数据
    如果是增删改操作 则使用executeUpdate();
    iv. 我们就要使用ResultSet对象拼接数据

  6. 创建业务层的接口  dao层的接口是什么样子,业务层的接口方法就是什么样子

servlet
我们之前使用操作的页面/文件名 .jsp后缀
JSP本身 一种服务端动态页面技术的组件规范, 主要的html和少量的java代码
Servlet,用来扩展Web服务器功能的组件规范,属于服务器端的程序,主要功能在于交互式的浏览和修改数据,生成动态Web内容。
画图给大家看一下,jsp servlet tomcat在运行的时候的关系

在这里插入图片描述

JSP请求  web服务器 JSP引擎  servlet容器  web服务器  客户端

tomcat运行机制

  1. 客户端发送请求页面
  2. tomcat接收请求,转交给servlet容器
  3. servlet容器去磁盘里面加载
  4. 把资源响应 以http形式把资源发送给客户端。

jsp与servlet的区别和关联的地方

  1. 运行过程, 如果第一次请求JSP ,请求会较慢,JSP Engine 会先把jsp程序转换成servlet代码,接着把servlet代码进行编译,以后运行才会更快。
    访问servlet,可以直接对其进行编译
  2. 职能分工
    jsp 更倾向于前端页面显示
    servlet 更侧重于业务逻辑
    温馨提醒: jsp本质上就是servlet,

温馨提醒:前后端分离
在这里插入图片描述

servlet容器实例化过程
init() service()destory();
servlet是一个特殊的Java应用程序,独立于操作系统和http传输协议之间。

  1. 没有main
  2. 不是由用户进行调用,而是由web容器进行调用
  3. 同时也有一定的生命周期

servlet如何处理请求
当传入进来一个请求的时候,Servlet会根据请求创建一个线程,并调用该Servlet的service()方法,该方法会检查对应的http请求类型,然后调用对应的doGet/doPost方法。
如果同时发送多个请求
servlet始终只会有一个实例,所以就会根据不同的请求,创建多个线程来处理多个请求操作。

我们目前使用servlet这个技术,实际上是使用MVC结构
m model= 实体类
V view = jsp 显示和加载数据
c controller = servlet
我们现在考试或者是实战的时候是在MVC结构上 + 三层
三层只是负责数据库的数据提取
servlet 控制器

浏览器  cotroller  model  cotroller  view  浏览器

servlet基本使用

  1. 所有的servlet必须要放在一个包里面进行管理

  2. 每个创建出来的servlet都会有很多种方法

  3. 所有的servlet都继承HTTPServlet的类

  4. 在下一个界面 设置配置文件 要把mapping/url 把 /servlet删掉

  5. 我们会看到打开了web.xml的配置文件

  6. 所有的servlet实际上就是跟配置文件打交道。
    a) 每次创建一个servlet web.xml都会多了两个东西
    b)
    c) 下面的servlet-class代表的是该servlet所在的位置
    d) servlet-name 是一个标记的名字
    e) 下面的url-pattern 在作为网址使用的时候,叫什么名字
    f) 两个servlet-name 的名字一定要保持一致

  7. servlet最重要的方法 doGet/doPost 接收到命令,根据http请求类型,具体调用到get/post方法
    a) 超链接  doGet
    b) 表单get  doGet
    c) 表单post  doPost
    d) 温馨提醒: 虽然我们有两个do方法 但是我们肯定不会因为有两个方法而写出两种不同的操作。我们把两个do方法里面的代码块全部清除,然后post调用get。

doGet()

  1. 调用三层拿到具体的数据
  2. 把数据放置到内置对象(一般使用session)
  3. servlet本身是不提供session , 需要靠request参数给我们提供
    request.getSession().setAttribute(“topic”, list);
    把数据插入到session
  4. session里面保存了数据之后就可以转发或者重定向到具体的页面
    response.sendRedirect(“index.jsp”);

直接访问servlet: localhost:端口号/项目名/servlet名字就跳转到具体的页面
反射加通用BaseServlet
反射如何跟servlet进行结合

  1. 为了解决什么问题而出现这个内容
    当一个jsp –view层 可能存在有多个请求由一个servlet处理。
    登录 加载数据 分页查询 都由同一个servlet处理,那么如果是这样子的话,我们应该怎么写代码呢?
    因为我们的处理方法有且只有一个,doGet/doPost处理
    所有的操作,都由一个方法管控。就要用单纯的参数化进行判断

给每个请求进行独立的参数

  1. 分页查询 method = page

  2. 登录 method = login

  3. 加载数据 method = log
    那么我在servlet里面就可以进行不同操作的请求
    在servlet里面根据method 进行调用不同的模块
    在这里插入图片描述
    该做法怎么样?
    在简单的少量的处理操作还是比较好的,
    但是如果遇到大量的请求,就会造成代码量非常可怕,维护的时候特别痛苦。

  4. 如何利用反射解决代码量多的问题
    我希望一个方法对应着一个请求操作.
    service + 反射 + 相同的参数名字

创建BaseServlet 为了继承HttpServlet
a) 为了重写service方法
protected void service(HttpServletRequest request , HttpServletResponse response){

	}

b) 利用这个service方法调用反射,能够调用不同的方法.
Class clazz = this.getClass(); //为了得到类的资源 得到类对象
String str = request.getParameter(“method”);
这个得到的参数实际上是跟想要调用的方法名同名.
我们能够利用反射直接调用该方法,
既然已经得到了要调用的方法名,那么这个方法是不是就是我们想要调用的方法.
c) 获取该对象的指定方法
clazz.getMethod(name, parameterTypes…);
//name 代表的是你要调用的方法名
//后续的参数 方法参数的类对象
//你调用的这个方法,需要什么参数,什么类型
Method method =
clazz.getMethod(str, HttpServletRequest.class,HttpServletResponse.class);
为什么会在类型后面加一个.class
它现在要的不是参数类型,参数的类对象
d) 调用方法
method.invoke(this, request,response);
invoke方法,就是调用Method类代表的方法,可以实现动态调用,
第一参数,是谁调用 子类调用
后面的参数,就是因为该方法需要两个参数,实参调用形参的时候,是不是也要对应着
e) 创建一个类继承BaseServlet
根据页面的多种请求创建出多个方法

温馨提醒:
加载数据的时候,或者是访问首页的时候,肯定不会让用户输入method=log.
我们可以在BaseServlet里面加上一个判断,

就不会因为空数据而报错。

f) 在配置文件里面,把新创建的继承类,写入配置文件。
我们现在继承的类都是不带http请求处理方法,相当于由父类来出来,父类决定调用什么方法。
如果我们的超链接明确就是要调用继承类里面的某一个方法,在配置文件里面写好,让这个类成为servlet一员。

先复制一个标签
修改两部分
在配置文件里面的标识名字,servlet文件名即可。
在src里面的目录文件,完整的包名+类名。
怎么确定是否正确,ctrl+鼠标 能够点击到目标类就没问题啦。

再复制一个标签
跟上面的同样的标签保持同名
一般就是 / + 类名

把tomcat服务重启即可使用。

反射加BaseServlet用起来是听方便的,但是存在一个小小的问题,当电脑配置不算太高的时候,第一次打开web.xml的时候都会卡很久很久,我们能不能不用web.xml但是依旧可以使用类似的效果。
servlet3.0的新特性,注解。
注解
servlet3.0的新特性注解解决每次新建继承类需要配置web.xml的问题
servlet3.0是Java EE6新特性
Java EE6 需要 tomcat7支持
tomcat7 至少要jdk6以上才支持
修改Java EE版本
项目右键 属性

点击 Add library

修改Java EE的版本为6.0

注解 在 需要使用的继承类里面
类名上面 加上一个@
使用的是 @WebServlet()
我们就是用这个注解,来替代web.xml里面的配置信息。
替代的标签,这个标签不要了,因为已经在当前的文件上。
然后再@WebServlet()括号里面添加 urlPatterns="/WelcomeServlet"
疑问1: 注解里面的name属性要不要?
name名字本身只是做标识,可用可不用。
疑问2: 注解里面的url 省不省
如果是单个值,url这个属性名可以省略,但是如果是存在多个值的话,就必须要标明。
name 可选的项
url 必填的项 value url servlet访问的url

疑问3 :url / value 属性为什么是string[ ]
我们有可能多个url路径同时都是一个处理的servlet,可以配置多个路径给同一个servlet
urlPatterns={"/WelcomeServlet1","/WelcomeServlet2"} 可以适配两个路径

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天元白手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值