JavaWeb学习 笔记为观看B站狂神视频记录
Posted 轻舟一曲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb学习 笔记为观看B站狂神视频记录相关的知识,希望对你有一定的参考价值。
JavaWeb
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
</web-app>
JSP头部编码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
概念
概述
Web开发:
- web,网页
- 静态web
- html,css
- 提供的数据始终不会发生变化
- 动态web
- 淘宝,不一样的人不一样的时间不一样的数据
- 技术栈:Servlet/JSP,ASP.php
在Java中,动态web资源开发技术统称JavaWeb
web应用程序
可以提供浏览器访问的程序;
统一的web资放在同一个文件夹下,web应用程序->Tomcat:服务器;
一个web应用多多部分组成(静态web,动态web),html,css,js,jsp,servlet,java程序,jar包,配置文件properties;
web应用程序编写完毕,若想提供给外界访问:需要一个服务器来统一管理。
静态web
![](https://image.cha138.com/20221212/3770daba4c164800a61b4e3bc5aded1f.jpg)
![](https://image.cha138.com/20221212/fc5a4d1b77fb4f3492b5302833edd85e.jpg)
动态web
![](https://image.cha138.com/20221212/f66fec408e904e059af44c91fb249c6d.jpg)
缺点:
- 假如服务器动态web资源出现了错误,我们需要重新编写我们的后台程序,重新发布;
优点:
- 动态更新,用户交互(数据持久化:注册,商品信息,用户信息…)
Web服务器
3个技术
![](https://image.cha138.com/20221212/2a9c298ce6e647568c3b607f2b14b3ae.jpg)
![](https://image.cha138.com/20221212/1c8285a4bc8b4c7d9b9678fe94b0f397.jpg)
服务器
服务器是一种被动操作,用来处理用户的请求和返回响应信息。
Tomcat,IIS…
![](https://image.cha138.com/20221212/de7a896ef8a445eeb004f0abecdf6ead.jpg)
Tomcat
![](https://image.cha138.com/20221212/b30f8d4ea2d3438ebcb9f7a59b684f25.jpg)
)
![](https://image.cha138.com/20221212/52f48c4e34e04365a30977d2293203be.jpg)
可以配置启动的端口号;
可以配置主机域名;
修改主机域名
![](https://image.cha138.com/20221212/cdc12ed5cd3b4cd582f32d97128a2ffc.jpg)
面试题:
![](https://image.cha138.com/20221212/27a92758077a4e7c8f1f8d8011747292.jpg)
web网站
- 将写的网站放到服务器的指定文件夹webapps中
-- webapps: Tomcat服务器的web目录
--ROOT
--mafu:网站的目录名
--WEB-INF
--classes:java程序
--lib:web应用程序所依赖的jar包
--web.xml:网站的配置文件
--index.html默认的首页
--static 资源文件
--css
--js
--img
HTTP
简述
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。
- http1.0:HTTP/1.0 一个连接只能获得一个web资源,断开连接
- http2.0:HTTP/1.1 一个连接只能获得多个web资源
HTTP请求
HTTP响应
![](https://image.cha138.com/20221212/62d55411cbd24a2faff006dfa89b2d96.jpg)
Maven
Maven核心思想:约定大于配置。
- 下载
![](https://image.cha138.com/20221212/c7dbfc48346545e2a047ca35912edeaf.jpg)
- 环境变量
![](https://image.cha138.com/20221212/0a5fdab3a92f4da3a07781fb1588c32c.jpg)
- 修改镜像
- 本地仓库,远程仓库
在IDEA中使用Maven
![](https://image.cha138.com/20221212/17de5dee498c418b932e193dd3fc0043.jpg)
![](https://image.cha138.com/20221212/2bb967365aa940da97e309ced24c42b0.jpg)
IDEA中设置Maven
![](https://image.cha138.com/20221212/8a016df2624643d89d7113407846cf15.jpg)
![](https://image.cha138.com/20221212/879f37ce6d2a4e51af733bbfb91a17c9.jpg)
Maven创建成功后注意看下IDEA默认设置。
![](https://image.cha138.com/20221212/ac618e8a42f54782bb0037d6f0462581.jpg)
上面是用Maven模板的项目。
现在创建普通Maven项目-----一个干净的Maven项目。
![](https://image.cha138.com/20221212/fc3971ee8ec64253b30251e43ce2e653.jpg)
注意Maven项目的资源过滤问题:
![](https://image.cha138.com/20221212/1827c1de57c84acbb3c5c2c4185adb63.jpg)
设置默认:
![](https://image.cha138.com/20221212/5af166da375b4fe2aba43b7a781f280e.jpg)
Maven默认web项目中的web.xml版本问题:
采用Tomcat默认4.0版本。
Servlet
测试
学习路线:
![](https://image.cha138.com/20221212/012d749c3ba34579b9ae5e4f5e63f314.jpg)
概述:
![](https://image.cha138.com/20221212/fde5f207b33b45a99542c60cc1b27843.jpg)
源码分析
![](https://image.cha138.com/20221212/c5111a6898a243439fb9c297fb26abc8.jpg)
测试:
public class Test01 extends HttpServlet
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
final PrintWriter writer = resp.getWriter();
writer.println("servletTest01");
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
doGet(req, resp);
编写映射:
java程序通过浏览器访问,需要给浏览器提供访问的路径,而浏览器需要连接web服务器拿到资源,所以需要在web服务器中注册servlet。
<servlet>
<servlet-name>Test01</servlet-name>
<servlet-class>com.mf.study01.Test01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Test01</servlet-name>
<url-pattern>/Test01</url-pattern>
</servlet-mapping>
原理
![](https://image.cha138.com/20221212/f8dee0d93ad249e6b9b71cc8307e4a43.jpg)
Mapping
测试
- 一个servlet指定一个路径
<servlet>
<servlet-name>Test01</servlet-name>
<servlet-class>com.mf.study01.Test01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Test01</servlet-name>
<url-pattern>/Test01</url-pattern>
</servlet-mapping>
- 一个servlet指定多个路径
<servlet>
<servlet-name>Test01</servlet-name>
<servlet-class>com.mf.study01.Test01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Test01</servlet-name>
<url-pattern>/Test01</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Test01</servlet-name>
<url-pattern>/Test02</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Test01</servlet-name>
<url-pattern>/Test03</url-pattern>
</servlet-mapping>
- 一个servlet可以指定通用映射路径
<servlet-mapping>
<servlet-name>Test01</servlet-name>
<url-pattern>/Test03/*</url-pattern>
</servlet-mapping>
/*直接跳转到首页。
- 前缀
![](https://image.cha138.com/20221212/83e7da6edc704bd5b9f544afe8d8fd76.jpg)
404处理
public class error extends HttpServlet
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
resp.setContentType("text/html");
resp.setCharacterEncoding("utf8");
final PrintWriter writer = resp.getWriter();
writer.println("<h2>页面走丢了!</h2>");
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
doGet(req, resp);
<servlet>
<servlet-name>error</servlet-name>
<servlet-class>com.mf.study01.error</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
遇到问题
部署war包成功,war exploded失败的问题
![](https://image.cha138.com/20221212/ca7b86a6f8fe4214b60dcdce1151ad89.jpg)
重建webapp模块发现结构差异:
![](https://image.cha138.com/20221212/c2f3e61d563f422fb36513973ac6e77a.jpg)
问题:
![](https://image.cha138.com/20221212/a94e30e71d5e46b9995c377459afdf08.jpg)
综上问题:后缀路写错了
![](https://image.cha138.com/20221212/83e7da6edc704bd5b9f544afe8d8fd76.jpg)
ServletContext
web容器启动的时候,它会为每个web程序创建一个对应的ServletContext对象,代表了当前的web应用。
共享数据
之后会用session和request替换ServletContext。
![](https://image.cha138.com/20221212/54ca0964b7164d6a8fdf4ef4df56e7cb.jpg)
Test01
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
ServletContext context= this.getServletContext();
String username = "上官婉儿";
context.setAttribute("username",username);
Test02
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
ServletContext context = this.getServletContext();
String username =(String) context.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().println("<h2>"+username+"</h2>");
![](https://image.cha138.com/20221212/d3b0b98c0e9e428c926ffe0a29eedc78.jpg)
获得初始化参数
几乎不用。
web.xml
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kKEXyWyL-1622023696504)(https://image.cha138.com/20221212/979f5c2fd98948e4b45cc249f79688b3.jpg)]
![](https://image.cha138.com/20221212/979f5c2fd98948e4b45cc249f79688b3.jpg)
转发
用request替换。
转发的时候url路径不会改变:
context.getRequestDispatcher("/test03").forward(req,resp);//调用forward进行转发
![](https://image.cha138.com/20221212/5c32dc990d5340e597e6b9b3e340e221.jpg)
获取资源文件
也可以用类加载反射获取。
Properties
![](https://image.cha138.com/20221212/fab2135289b846eeab0c06a7b791ac51.jpg)
![](https://image.cha138.com/20221212/6f3404824ef0417fa2237965e9a84f81.jpg)
相对web应用拿到资源。
![](https://image.cha138.com/20221212/9d2cf43bf9b44512b8b522aa16c6e184.jpg)
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties properties = new Properties();
properties.load(is);
resp.getWriter().println("username:"+properties.getProperty("username"));
resp.getWriter().println("password:"+properties.getProperty("password"));
Response
HttpServletResponse
web服务器收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest的对象和一个代表响应的HttpServletResponse的对象。
![](https://image.cha138.com/20221212/2e575fef24b8447485f4180207cccf53.jpg)
- 输出消息
- 下载文件
下载文件
![](https://image.cha138.com/20221212/e2e05e13b27543fdac7fcea0788aaa8f.jpg)
测试:
![](https://image.cha138.com/20221212/b5d54630958c4e448d8d6753afdf962d.jpg)
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
//1.获取文件下载的路径
String realPath = "D:\\\\IDEA\\\\MyProject\\\\KuangStudy\\\\JavaWeb\\\\Servlet03\\\\target\\\\classes\\\\成徐.jpeg";
System.out.println("下载文件的路径" + realPath);
//2.下载的文件名是什么?
String fileName = realPath.substring(realPath.lastIndexOf("\\\\") + 1);
//3.设置办法让浏览器能够支持(Content-Disposition)我们需要的东西
//下载文件名处理乱码问题:URLEncoder.encode
resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
//4.获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
//5.创建缓冲区
byte[] buffer = new byte[1024];
int len=0;
//6.获取OutputStream对象
ServletOutputStream out = resp.getOutputStream();
//7.将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端
while ((len=in.read(buffer))!=-1)
out.write(buffer,0,len);
in.close();
out.close();
各种静态资源导出问题
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.jpeg</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
![](https://image.cha138.com/20221212/74d7a46fd73c4a54a29f67c9f04c6ce3.jpg)
验证码
- 前端实现
- 后端实现:需要用到Java的图片类,生成图片。
![](https://image.cha138.com/20221212/96da3ec85521490c91741b4476952556.jpg)
//生成随机数
private String makeRandom()
Random random = new Random();
String num= random.nextInt(99999999)+"";
StringBuffer buffer = new StringBuffer();
for (int i = 0; i <8- num.length(); i++)
buffer.append("0");
num=num+buffer.toString();
return num;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
//如何让浏览器1s刷新一次
resp.setHeader("refresh","1");
//在内存中创建图片
BufferedImage image = new BufferedImage(300, 80, BufferedImage.TYPE_INT_RGB);
//得到图片
Graphics2D graphics =(Graphics2D) image.getGraphics();//一只2D的笔
graphics.setBackground(Color.white);
graphics.fillRect(0,0,300,80);
//给图片写数据
graphics.setColor(Color.yellow);
graphics.setFont(new Font(null,Font.BOLD,60));
graphics.drawString(makeRandom(),10,60);
//告诉浏览器这个请求用图片方式打开
resp.setContentType("image/jpeg");
//网站存在缓存,不让浏览器缓存
resp.setDateHeader("expires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","no-cache");
//把图片写给图片
ImageIO.write(image,"jpeg",resp.getOutputStream());
重定向
(重点) 地址会发生该改变,一个web资源B受到客户端A请求后通知客户端A去访问另外一个web资源C,这个过程叫重定向。
常见场景:登录页面…
void sendRedirect(String var1) throws IOException;
重定向问题:添加项目名
resp.sendRedirect(req.getContextPath()+"/Image");
或
/* resp.setHeader("Location","/Servlet03_war/Image");
resp.setStatus(HttpServletResponse.SC_FOUND);//302*/
//需要添加项目名字
resp.sendRedirect("/Servlet03_war/Image");
![](https://image.cha138.com/20221212/635b8ea48ddd44a58bd7825fcd7a28aa.jpg)
面试题:转发和重定向区别
相同:页面都会实现跳转
不同:转发时url不改变 307,重定向url改变 302。
提交表单跳转路径问题:
-- 代表当前项目
$pageContext.request.contextPath
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<form action="$pageContext.request.contextPath/Request" method="get">
<label>用户名:</label>
<input type="text" name="username">
<br>
<label>密码:</label>
<input type="password" name="password">
<br>
<input type="submit" value="提交">
</form>
</body>
</html>
Request
HttpServletRequest
![](https://image.cha138.com/20221212/d151bf71e6844c4f83db926671e9c53d.jpg)
获取参数
![](https://image.cha138.com/20221212/b0c728e4013c4216833c8de5de183db3.jpg)
转发
public class Login extends HttpServlet
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
req.setCharacterEncoding("UTF-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobby B站狂神说Java---记录SpringMVC学习笔记