JavaWeb

JavaWeb-尚硅谷

Tomcat 目录介绍

bin 专门用来存放 Tomcat 服务器的可执行程序
conf 专门用来存放 Tocmat 服务器的配置文件
lib 专门用来存放 Tomcat 服务器的 jar 包
logs 专门用来存放 Tomcat 服务器运行时输出的日记信息
temp 专门用来存放 Tomcdat 运行时产生的临时数据
webapps 专门用来存放部署的 Web 工程。
work 是 Tomcat 工作时的目录, 用来存放 Tomcat 运行时 jsp 翻译为 Servlet 的源码, 和 Session 钝化的目录。

启动Tomcat服务器

Tomcat 目录下的 bin 目录下的 startup.bat 文件, 双击, 就可以启动 Tomcat 服务器。

测试 Tomcat 服务器启动成功? ? ?
打开浏览器, 在浏览器地址栏中输入以下地址测试:
1、 http://localhost:8080
2、 http://127.0.0.1:8080
3、 http://真实 ip:8080

出现界面说明启动成功!

修改Tomcat的端口号

mysql默认端口号:3306

tomca默认端口号:8080,在conf目录中的server.xml文件中修改(修改完重启tomcat)。

http默认端口号:80

部署web工程到tomcat

把web工程的目录拷贝到tomcat的webapps目录下。

一个文件夹就是一个工程。

访问tomcat下的web工程

http://localhost:8080/book/static/img/default.jpg

Servlet

javaweb三大组件(Servlet,Filter,Listener)之一。

servlet是运行在服务器上的一个java小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。

image-20211128141340962

生命周期:

1、执行Servlet构造器方法

2、执行init方法

一二步只在第一次访问的时候创建

3、执行service方法

第三步每次访问都会调用

4、执行destroy方法

web工程停止的时候调用

ServletConfig

servlet程序的配置信息类。

在每个servlet程序创建时,就创建一个对应的ServletConfig对象。

作用:

  • 获取Servlet程序的别名Servlet-name的值
servletConfig.getServletName()
  • 获取初始化参数init-param
servletConfig.getInitParameter("username")
  • 获取ServletContext对象
servletConfig.getServletContext()

ServletContext

一个接口,表示Servlet上下文对象。

一个工程只有一个servletContext上下文对象, 多次调用,不同的类调用,均调用的同一个对象。

Servlet对象是一个域对象。

在web工程部署启动的时候创建。在web工程停止的时候销毁。

域对象?

可以向Map一样存取数据的对象,叫域对象。

这里的域指的是存取数据的操作范围,整个web工程。

作用:

  • 获取web.xml中配置的上下文参数context-param
  • 获取工程路径,/工程路径
  • 获取工程在服务器的上的绝对路径
  • 像Map一样存取数据(存取的数据在工程重新部署后会丢失)
ServletContext context = getServletConfig().getServletContext();
context.getInitParameter("username"); // context-param参数
context.getContextPath(); // 当前工程路径
// 当前工程路径:/06_servlet
context.getRealPath("/"); // 工程部署路径
//工程部署的路径是:D:\5_JavaWebProjects\JavaWeb\out\artifacts\06_servlet_war_exploded\
context.getRealPath("/css"); // 工程下css目录的绝对路径
//工程下css目录的绝对路径是:D:\5_JavaWebProjects\JavaWeb\out\artifacts\06_servlet_war_exploded\css

HTTP协议

客户端和服务端之间通信需要遵守的规则。

HTTP协议中的数据又叫报文。

  1. 客户端 -> 发送数据 -> 服务端:请求
  • GET请求

    • 请求行 GET /06_servlet/a.html HTTP/1.1

    • 请求头

      Refer:http://localhost:8080/06_servlet/a.html,请求发起时,浏览器地址栏中的地址

      Accept:客户端可以接收的数据类型

      Accept-Encoding

      Accept-Language

      User-Agent:浏览器的信息

      Host:请求的服务器ip和端口号

      connection:告诉服务器请求连接如何处理

      ​ Keep-Alive:告诉服务器回传数据不要马上关闭,保持一小段时间的连接

      ​ Closed:马上关闭

  • POST请求

    • 请求行:POST /06_servlet/hello HTTP/1.1

    • 请求头

      Content-Type:表示发送的数据类型。两种

      ​ application/x-www-form-urlencoded:表示提交的数据格式 是:name=value&name=value,然后对其进行url编码。

      ​ multipart/form-data:表示以多段的形式提交数据给服务器 (以流的形式提交,用于上传)

      Content-Length:表示发送的数据的长度。

      Cache-Control:表示如何控制缓存。

  • 请求体

    发送给服务器的数据(Payload)

image-20211129101311990

  1. 客户端 <- 发送数据 <- 服务端:响应
  • 响应行

    • 响应协议和版本号

    • 响应状态码

      200:请求成功

      302:请求重定向

      404:服务器已收到请求,但是需要的数据不存在(请求地址错误)

      500:服务器已收到请求,服务器内部错误(代码错误)

    • 响应状态描述符

  • 响应头

    • key:value
  • 响应体:回传给客户端的数据

HttpServletRequest

客户端发送请求后,tomcat服务器会把请求过来的http协议信息进行解析并封装到Reuqest对象中,然后传递到service方法(doGet,doPost)中给我们使用。可以通过HttpServletReuqest对象获取到所有请求的信息

常用方法

i. getRequestURI() 获取请求的资源路径
ii. getRequestURL() 获取请求的统一资源定位符(绝对路径)
iii. getRemoteHost() 获取客户端的 ip 地址
iv. getHeader() 获取请求头
v. getParameter() 获取请求的参数
vi. getParameterValues() 获取请求的参数(多个值的时候使用)
vii. getMethod() 获取请求的方式 GET 或 POST
viii. setAttribute(key, value); 设置域数据
ix. getAttribute(key); 获取域数据
x. getRequestDispatcher() 获取请求转发对象
/**
输出
URI => /07_servlet/requestAPIServlet
URL => http://localhost:8080/07_servlet/requestAPIServlet
客户端 ip地址 => 127.0.0.1
请求头User-Agent ==>> Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34
请求的方式 ==>> GET
/
// 设置请求体的字符集为UTF-8,从而解决post请求的中文乱码问题
// 也要在获取请求参数之前调用才有效
req.setCharacterEncoding("UTF-8");

Get请求和Post的区别:

get请求会将提交参数放在url中。

请求转发:

服务器收到请求后,从一个资源跳转到另一个资源的操作叫请求转发。

/**
请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射到IDEA代码的web目录<br/>
*/
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
//RequestDispatcher requestDispatcher = req.getRequestDispatcher("http://www.baidu.com");

// 走向Sevlet2(柜台 2)
requestDispatcher.forward(req,resp);

通过请求转发跳转后,浏览器地址变了。

要想调回首页,可以在html文件中通过base标签设置跳转参照路径。

image-20211129170907271

image-20211129170853518

image-20211129171135026

image-20211129171315083

HTTPResponse

需要返回给客户端的信息,通过HttpServletResponse对象来进行设置。

 getOutputStream();	//字节流,常用于下载
 getWriter();		//字符流,常用于回传字符串

两个输出流只能使用一个。

image-20211129205641193

JSP

java server pages。java的服务器页面。

主要作用是代替Servlet程序回传html页面的数据。

内置对象:

request 		请求对象
response		 响应对象
pageContext 	jsp的上下文对象
session 		会话对象
application 	ServletContext对象
config 			ServletConfig对象
out 			jsp输出流对象
page 			指向当前jsp的对象
exception		 异常对象

四个域对象分别是:
pageContext (PageContextImpl 类) 当前 jsp 页面范围内有效
request (HttpServletRequest 类)、 一次请求内有效
session (HttpSession 类)、 一个会话范围内有效(打开浏览器访问服务器, 直到关闭浏览器)
application (ServletContext 类) 整个 web 工程范围内都有效(只要 web 工程不停止, 数据都在)

image-20211204143840781

EL

Expression Language。 是表达式语言。

EL 表达式主要是代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出。

文件上传

客户端(浏览器)向服务器发出post请求,上传文件。(如图片等。)

image-20211204195950178

文件下载

image-20211204202131602

业务逻辑

1.使用静态包含,动态包含,对jsp页面中共同的内容进行抽取

2.在静态包含中对basepath进行设置

3.BaseServlet的抽取

jsp页面post请求,添加隐藏域和修改请求地址action=“userServlet,value=’'login” ;

BaseServlet获取action业务鉴别字符串,获取相应的业务 方法反射对象。调用目标业务方法;

UserServlet方法继承了BaseServlet方法,业务方法login,实现了对应的业务功能。

image-20211205142940203

MVC

Model 模型,View 视图,Control 控制器

View 视图:只负责数据和页面的显示,不接受任务与显示数据无关的代码——JSP,HTML

Controller控制器:只负责接收请求,调用业务层的代码处理请求,然后派发页面,是一个"调度者"的角色——Servlet

Model 模型:将与业务逻辑相关的数据封装为具体的JavaBean类,不掺杂任何与数据处理相关的代码——JavaBean/Domain/entity/pojo.

MVC:将软件代码拆分称为组件,单独开发,组合使用,降低耦合度。

image-20211205151634814

工程添加模块步骤:

1.编写数据库表

2.编写JavaBean

3.编写Dao和测试Dao

4.编写Service和测试Service

5.编写web层,和页面联调测试

前台后台权限

image-20211205162818255

image-20211205162711247

实现添加图书,表单提交功能时,如果使用请求转发,用户每次刷新页面都会发起新的请求,会导致表单的重复提交。

解决:使用请求重定向。点击提交表单之后,在servlet中请求重定向,则该次请求已结束。

image-20211205164054581

Cookie

Cookie是服务器通知客户端保存键值对的一种技术

客户端有了Cookie后,每次请求都发送给服务器。

每个Cookie的大小不能超过4kb。

image-20211206222011165

生命控制

setMaxAge()

正数:表示在指定的秒数后过期

负数,表示浏览器一关,Cookie就会被删(默认值是-1)

零,表示马上删除Cookie。

Cookie有效路径Path的设置

Cookie的path属性可以有效的过滤哪些Cookie可以发送给服务器,哪些不发。

CookieA :path=/工程路径

CookieB :path=/工程路径/abc

请求地址如下:
http://ip:port/工程路径/a.html
CookieA 发送
CookieB 不发送
http://ip:port/工程路径/abc/a.html
CookieA 发送
CookieB 发送

可以实现自动填充用户名和密码。

在第一次登陆时,表单提交,用户名密码发送给服务器Servlet,通过setCookie,通知服务器保存cookie信息(信息和有效时长);

第二次登陆时,浏览器发起请求,将cookie信息一同发送给服务器,jsp页面通过隐藏域读取cookie信息,获取用户名并显示到浏览器。

Session

一个接口,HttpSession。

会话,用来维护一个客户端和服务器之间关联的技术。

每个客户端都有自己的一个Session会话。

Session会话中,经常用来保存用户登录之后的信息。

每个会话都有一个身份证号。 也就是 ID 值。 而且这个 ID 是唯一的。
getId() 得到 Session 的会话 id 值。

Session的超时指的是客户端两次请求的最大间隔时长。每次发起请求,时超时时间会被重置。

session值的设置:

正数:超时时长

负数:永不超时。

invalidata(),马上超时

表单重复提交

表单重复提交有三种常见的情况:
一: 提交完表单。 服务器使用请求转来进行页面跳转。 这个时候, 用户按下功能键 F5, 就会发起最后一次的请求。造成表单重复提交问题。 解决方法: 使用重定向来进行跳转
二: 用户正常提交服务器, 但是由于网络延迟等原因, 迟迟未收到服务器的响应, 这个时候, 用户以为提交失败,就会着急, 然后多点了几次提交操作, 也会造成表单重复提交。
三: 用户正常提交服务器。 服务器也没有延迟, 但是提交完成后, 用户回退浏览器。 重新提交。 也会造成表单重复提交。

Filter过滤器

  • Filter过滤器是JavaEE的规范,也即是接口。

作用:拦截请求,过滤响应。

Filter 的生命周期包含几个方法:
1、 构造器方法
2、 init 初始化方法
第 1, 2 步, 在 web 工程启动的时候执行(Filter 已经创建)
3、 doFilter 过滤方法
第 3 步, 每次拦截到请求, 就会执行
4、 destroy 销毁
第 4 步, 停止 web 工程的时候, 就会执行(停止 web 工程, 也会销毁 Filter 过滤器)

  • FilterConfig 类

FilterConfig 类见名知义, 它是 Filter 过滤器的配置文件类。
Tomcat 每次创建 Filter 的时候, 也会同时创建一个 FilterConfig 类, 这里包含了 Filter 配置文件的配置信息。
FilterConfig 类的作用是获取 filter 过滤器的配置内容
1、 获取 Filter 的名称 filter-name 的内容
2、 获取在 Filter 中配置的 init-param 初始化参数
3、 获取 ServletContext 对象

  • FilterChain 过滤器链

在chain.doFilter中套接过滤器。

多个Filter共同执行时,默认在同一个线程中,使用同一个Request对象。他们执行的优先顺序是由在web.xml中从上到下配置的顺序决定。

  • Filter 的拦截路径
--精确匹配
<url-pattern>/target.jsp</url-pattern>
以上配置的路径, 表示请求地址必须为: http://ip:port/工程路径/target.jsp
--目录匹配
<url-pattern>/admin/*</url-pattern>
以上配置的路径, 表示请求地址必须为: http://ip:port/工程路径/admin/*
--后缀名匹配
<url-pattern>*.html</url-pattern>
以上配置的路径, 表示请求地址必须以.html 结尾才会拦截到
<url-pattern>*.do</url-pattern>
以上配置的路径, 表示请求地址必须以.do 结尾才会拦截到
<url-pattern>*.action</url-pattern>
以上配置的路径, 表示请求地址必须以.action 结尾才会拦截到  
  • 过滤器与ThreadLocal实现数据库操作的事务管理。

ThreadLocal conns = new ThreadLocal();

一次请求发起时,对一个数据库事务的操作都是在一个线程中完成的,也就是使用的都是同一个connection,那么就允许我们在整个事务处理过程结束的时候,对这个事务进行提交或者回滚。(connection.commit())

在servlet中,如果出现错误,将错误抛出给service,service再将错误抛出,一直到过滤器中,对错误进行捕获,对事务进行提交或关闭。

image-20211209155115978

image-20211209155142821

  • tomcat展示友好的错误信息页面

image-20211209155308589

Json

json 是一种轻量级的数据交换格式。
轻量级指的是跟 xml 做比较。
数据交换指的是客户端和服务器之间业务数据的传递格式。

在java中的使用,

javaBean和json的互转

List和json的互转

map和json的互转

map转字符串,字符串转json对象。

需要用高gson包,转换的时候提供匿名内部类。

// 1.2.3、 map 和 json 的互转
@Test
public void test3(){
    Map<Integer,Person> personMap = new HashMap<>();
    personMap.put(1, new Person(1, "国哥好帅"));
    personMap.put(2, new Person(2, "康师傅也好帅"));
    Gson gson = new Gson();
    // 把 map 集合转换成为 json 字符串
    String personMapJsonString = gson.toJson(personMap);
    System.out.println(personMapJsonString);
    // Map<Integer,Person> personMap2 = gson.fromJson(personMapJsonString, new PersonMapType().getType());
    
    Map<Integer,Person> personMap2 = gson.fromJson(personMapJsonString,new TypeToken<HashMap<Integer,Person>>(){}.getType());
    
    System.out.println(personMap2);
    Person p = personMap2.get(1);
    System.out.println(p);
}

AJAX

AJAX 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML) , 是指一种创建交互式网页应用的网页开发技术。

ajax 是一种浏览器通过 js 异步发起请求, 局部更新页面的技术。

Ajax 请求的局部更新, 浏览器地址栏不会发生变化。

局部更新不会舍弃原来页面的内容 。

image-20211209223351381

i18n国际化

image-20211209230305558

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值