9.20
1. 什么是servlet, servlet的本质是什么
Servlet:
Server Appelt Java服务连接器(用户交互的浏览和生成动态web数据)
Servlet的本质就是能够实现servlet接口的普通的类
自定义类 继承的HttpServlet 抽象类
HttpServlet extends GenericServlet 抽象类
GenericServlet implements Servlet 接口
2. servlet的执行流程
1)浏览器向服务器发送请求
http://localhost:8080/day44_Servlet_war_exploded/login2)
服务器解析路径项的uri
/day44_Servlet_war_exploded/login
在web.xml解析寻找当前"/login",找到了
3)获取它url-pattern---对应的servlet-name : 默认定义Servlet的类名
3.1)从映射配置----找到servlet基本配置 ---servlet-name: 两个名称一致
3.2)servlet-name---->servlet-class---->获取类的全限定名称
4)反射获取当前类的字节码文件对
Class c = Class.forName("类的全限定名称") ;
5)创建当前类实例
Object obj = c.newInstance() ;
6)调用当前类的方法
Method m =c.getDeclaredMethod("doGet",HttpServletRequest.class,HttpServletResponse.class) ;
//取消Java语言访问检查
m.setAccessiable(true);
m.invoke(obj,request,response) ;
7)响应给浏览器一些内容---
response.getWiter().write("xxx") ;
3. servlet的生命周期
servlet是单例的
//自己提供了无参构造方法
int(ServletConfig config) : 初始化方法
service(请求对象, 响应对象) : 服务方法
destroy( ) : 销毁
构造方法和初始化都只执行一次
service(请求对象, 响应对象): 服务方法; 可以被执行多洗, 程序入口
doXXX( )视具体的服务方法; 实际开发中, 覆盖具体的doXXX( ) ,
针对前端不同提交方式, 执行不同的doXXX( )
单例设计模式:
饿汉式和懒汉式
饿汉式是不会出现问题的单例
类一加载就立即创建当前类对象
懒汉式是可能多线程安全问题的一种单例模式(场景:懒加载场景 mybatis框架)
类一加载:不会立即创建对象, 而是去判断, 如果为null,才去new
- 单例设计模式是创建型设计模式的一种
- 单例设计模式思想:在内存中始终创建一个对象
- 有两种模式
- ①饿汉式: 不会出现安全问题的一种单例模式
---类一加载,就立即创建当前类实例! - 1)当前类的无参构造方法私有化
- 2)在类的成员位置,创建一个当前类的实例(实例变量),私有的
- 3)对外提供静态的公共访问方法,返回值是当前类本身
- Java提供了Runtime---标准的单例模式之饿汉式
- 通过 Java应用程序获取计算机相关环境的信息
public class Student {
//在类的成员位置,创建一个当前类的实例(实例变量),私有的
private static Student s = new Student() ;
//无参构造方法私有化
private Student(){}
//对外提供静态的公共访问方法,返回值是当前类本身
public static Student getStudent(){
return s ;
}
- 懒汉式: 可能出现安全问题的单例模式
- 延迟加载场景或者懒加载场景,就会导致出现问题----结合多线程场景
- 如何解决线程安全问题--------->synchronzied(锁对象){}---->或者同步方法
- 1)无参构造方法私有化
- 2)在当前类的成员位置提供一个私有的静态的 当前类型的变量
- 3)对外还有提供公共的静态方法,返回值是当前类本身
- 需要判断:如果当前 对象名是null,然后在去new 创建
public class Teacher {
private static Teacher t ;
private Teacher(){} //外界类不能new了
public synchronized static Teacher getTeacher(){ //静态的同步方法
if(t==null){
t = new Teacher() ;
}
return t;
}
}
4. servlet如何接受前端提交的参数
注意事项:
1)表单提交, 表单项必须写name属性; 给系统后端标记: 书写的什么内容
2)接收参数
HttpServletRequest
String getParamenter(String name) : //参数为表单中的name属性
//通过参数名称或者参数值
numeration<String> getParameterNames() : //获取表单中所有的参数名称
Map<K,V> getParameterMap( ) : //通过请求对象获取所有的键和值
//(name属性值以及对应输入的内容)
5. 如何让servlet在web容器启动时就创建对象
servlet默认访问的时候创建对象!
web.xml 中配置servlet的时候, 可以servlet基本配置
<load-on-startup><servlet>
<servlet-name>MyLifeServlet</servlet-name>
<servlet-class>com.qf.servlet_life_02.MyLifeServlet</servlet-class>
<!--
配置servlet初始化时机 tomcat服务器启动的时候,就立即创建当前servlet对象
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MyLifeServlet</servlet-name>
<!--路径必须唯一 精确匹配 -->
<url-pattern>/life</url-pattern>
</servlet-mapping>
9.21
1.请求转发的特点以及代码实现
1) 地址栏没有变化, 始终访问后端地址
2) 请求转发的整个过程request对象是一致的, 某个jsp页面需要后端传递的数据, 就需要使用请求转发
3)可以访问WEB-INF下的资源文件
请求转发的原理及注意事项
/**
* ServletContext的作用3(重点)
* 请求转发:后端能够控制的一种页面跳转(可以在不同的servlet之间进行跳转)
*/
request.getRequestDispatcher("/WEB-INF/adv.jsp").forward(request,response);
2. 获取前端表单提交的参数方式是什么(补充)
String 实际内容= request.getParameter(表单中的name属性值) ;
Enumeration<String> en = request.getParameterNames( );
//获取所有表单中的name 属性值(参数名称)
while(en.hasMoreElements()){
String paramenterName = en.nextElement() ;
String 实际内容 = request.getParameter(表单中的name属性值) ;
}
Map <String, String[ ]>map = request.getParameterMap( ) ;
3. 四个域对象从小到大分别是什么
四个域对象: 从小到大的单位
PageContext -----page域, 在某个jsp页面中有效
HttpServletRequest ----request域, 在一次请求中有效 (使用最频繁) 请求对象
HttpSession -----Session域, 在一次会话中有效 (用户登录) 将数据存储在服务器端
ServletContext -----application域, 全局对象, 在整个web application有效
4. jsp的核心标签库的使用步骤(JSTL)
即 JSP 标标签库, 使用里面核心库
<1>需要导入两个包 jtsl 1.1.2.jar
standard 1.1.2.jar
<2>引入jsp第三个指令 ----taglib指令
<%@taglib prefix = "c" uri = "http://sun公司/jsp/jstl/core" %>
prefix = "前缀名称"
uri : c 标签的网络地址
<3> 使用c标签
el -----${ == 或者是运算符 }
①<c: if> 判断
格式
<c : if test= "${ }"> ------>相当于Java中的if语句, 如果成立, 则成立于具体
</ c : if>
el 表达式, 有关键字empty
${empty 域对象属性名称 }
② <c: choose>
格式
<c: choose>
<c: when test= ""{number==1}>
<h1>周一</h1>
</c:when>
.....
</c: choose>
③<c: forEach> ------>遍历
<c: forEach item = "获取的数据">
item属性: 从后端集合数据包 ${ 域对象中存储属性名称 }
var属性: 循环中的变量名
varstatus : 内置的循环中变量名的状态属性
5. MVC三层架构思想
MVC 是一种架构思想, 代码分层的思想
M: model 业务模型
最基本的业务模型: Java实体类, 给里面的数据封装数据 ---- pojo
com.qf.pojo ---->实体类; 最基本的业务模型
com.qf.service ----> 业务代码, 业务接口以及业务接口实现; 完成业务逻辑; 获取数据
com.qf.dao ---->数据库访问层(持久层) ; 接口以及jdbc实现; 完成对数据库的crud(增删查改)
com.qf.controller ----->控制器代码 ----写servlet 后端, java服务连接器
com.qf.utils/common ---->通用的控制器
V : view 视图
目前技术jsp ---- 展示数据 ----通过jsp的jstl标签库展示数据
通过jsp或者html渲染一种视图效果(在jsp的el表达式里面获取数据)
html ----- > 结合jquery+ajax完成
网页静态化技术 freemaker -----${ }
thyemleaf ----${ } ----在springboot
jsp, thyemleaf, freemaker ---- 模板引擎
C : controller 控制器
servlet: 编写的服务端程序 ---->控制视图
前端访问后端的连接器(中间层) ---- servlet
(图解)
9.22
1. 重定向的原理
//1)响应对象HttpServletResponse---有一个方法
//void setHeader(String var1, String var2):设置响应头
response.setHeader("location",request.getContextPath()+"/adv.jsp");
//2) 设置响应状态码 302
//void setStatus(int var1);
response.setStatus(302) ;
request.setAttribute("name","高圆圆"); //requrest域存储数据,重定向过去获取不到
//简写格式HttpResponse对象--->void sendRedirect(String var1) throws IOException; 重定向'
response.sendRedirect(request.getContextPath()+"/xxx.jsp或者xxx.html") ;
2. 请求转发和重定向的区别
1)地址栏是否有变化
请求转发: 没有变化
重定向 : 地址栏有明显变化
2) 是否能够访问WEB-INF下的资源文件
只有请求转发可以访问
重定向: 不能访问
3) 整个过程request对象是否一致
请求转发 : 是一致的 , 所以使用request域存储数据, jsp页面获取数据
重定向 : request对象不一致, request域中存储数据, jsp页面获取不到数据, 仅仅页面跳转
3. 四个域对象分别是什么
pageContext ; page域, 在当前jsp页面中有效
HttpServletRequest ; request域, 在一次请求中有效
HttpSession ; session域, 在一次会话中有效
ServletContext ; application, 在整个web application 域中有效
9.23
1. 什么是maven
Maven : POM project Object Model 项目对象模型
核心思想
通过一小段描述信息jar文件 一种索引(坐标地址)>来管理项目的构件, 报告文档, ...
maven工作原理
2. 获取一个类的字节码文件对象的方式
三种
任意Java对象 getClass() 方法
任意Java类型的class属性: 类名.class
Class.forName("类的全限定名称")
3. Servlet的注解方式替代xml配置方式的书写格式
<!--项目地址工程名称标识-->
<groupId>com.qf</groupId>
<artifactId>Maven_Project</artifactId>
<version>1.0-SNAPSHOT</version>
<!--项目打包成war包-->
<packaging>war</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<!--添加依赖jar包-->
<dependencies><!-- 通过这段信息:本地仓库的jar依赖了-->
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.25</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
</dependency>
</dependencies>