Tomcat
配置端口号:
Tomcat文件夹=》conf=》sever.jsp文件下=》
配置主机的名称
路径:C:\Windows\System32\drivers\etc hosts文件
默认端口号
Tomcat: 8080
mysql:3306
http:80
https:443
高难度面试题
网站是如何进行访问的!
1.输入域名 回车
2.检查本机的C:\Windows\System32\drivers\etc hosts配置文件下有没有这个域名映射;
有则:直接返回对应的ip地址,这个地址中有我们需要访问的web程序,可以直接访问
没有:去DNS服务器找(全世界的网站域名都在这里)
发布一个网站
将自己的网站,放到服务器中在指定的web应用的文件夹下面(webapps)
Http
什么是Http
Http(超文本传输协议)是一个简单的请求-响应协议,他通常在TCP之上
- 文本:html、字符串、。。。
- 超文本:图片、音乐、视频、定位、地图。。。
- 80
Https:安全的 443
两个时代
- http1.0 客户端可以与web服务器连接后,只能获得一个web资源,断开连接
- http2.0 客户端可以与web服务器连接后,只能获得多个web资源
Http请求
客户端——发请求——到服务器
百度:
Request URL:https://www.baidu.com/ //请求地址
Request Method:GET //方法get、post
Status Code:200 OK //状态码
Remote Address:14.215.177.39:443 //远程
1.请求行
请求方式为get
get:能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容。不安全但高效
post:能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容。安全但不高效
2.消息头
Accept:告诉浏览器,他所支持的数据类型
Accept-Encoding: 支持哪种编码格式
Accept-Language:告诉浏览器 他的语言环境
cache-Control:缓存控制
Connection:告诉主机,请求完成是保持终断还是连接
Host:主机
Http响应
服务器——响应——客户端
1.响应体
Accept:告诉浏览器,他所支持的数据类型
Accept-Encoding: 支持哪种编码格式
Accept-Language:告诉浏览器 他的语言环境
cache-Control:缓存控制
Connection:告诉主机,请求完成是保持终断还是连接
Host:主机
Refrush: 告诉客户端,多久刷新一次
Location:让网页重新定位;
2.响应状态码
200:成功
3**:请求重定向
重定向:你给我到我给你的新位置去
404:找不到资源
资源不存在
5**:服务器代码错误 500 502(网关错误)
常见面试题:
当你的浏览器地址栏输入地址并回车的一瞬间到页面能返回回来,经历了什么?
Maven
为什么学习这个技术
1.在javaweb开发中,需要大量的jar包,我们手动导入
2.如何让一个东西帮我们导入和配置这个jar包
由此Maven产生
Maven项目架构管理工具
我们目前用来就是方便导入jar包
Maven的核心思想:约定大于配置
下载安装Maven
官网:https://maven.apache.org
下载完成后解压
配置环境变量
- M2_HOME maven目录下的bin目录
- MAVEN_HOME ,maven目录
- 在系统的path中配置 %MAVEN_HOME%\bin
- 测试配置成功与否
(阿里云镜像)修改配置文件
在conf目录下的setting文件
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
本地仓库
建立一个本地仓库:localRepository
<localRepository>D:\java\Maven\apache-maven-3.8.1\maven-repo</localRepository>
在idea中使用Maven
启动idea=》创建mavenWeb项目=》=》创建项目名=》配置setting和localRepository=》等待项目初始化完成
观察maven-repo仓库中出现了什么东西
idea中的maven设置
创建一个普通的maven项目
在idea中配置Tomcat
pom文件
pom.xml是maven的核心配置文件
Servlet
什么是servlet
- servlet就是sun公司开发动态web的一门技术
- sun公司在这些API中提供了一个接口叫做:servlet,如果你想开发一个servlet程序只需要实现两个小步骤
1.用类实现servlet接口
2.把开发好的java类部署到web服务中
把实现了servlet接口的java程序叫做,servlet
HelloServlet
1.构建一个普通的Maven项目,删掉里面的src目录,我们的学习就在这个项目里建立module
2.关于maven项目父子工程的理解:
父项目中会有
<modules>
<module>servlet-01</module>
</modules>
父项目中的java子项目可以直接使用
maven环境优化
1.修改web.xml为最新的(用Tomcat的)
2.将maven的结构搭建完整
编写一个Servlet程序
1.编写一个普通类
2.实现servlet接口,继承HttpServlet
public class HelloServlet extends HttpServlet {
//由于get post 只是请求实现的不同方式,可以相互调用,业务逻辑都一样
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();//响应流
writer.write("Hello,World");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
编写Servlet的映射
为什么需要映射:我们写的java程序,需要在通过浏览器访问,而浏览器连接web服务器,所以我们要在web服务中注册我们写的servlet,还需要给它一个浏览器能访问的路径。
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.hua.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
配置Tomcat
运行测试
servlet原理
servlet是由web服务器调用,web服务器在收到浏览器请求后,会
mapping 问题
1.一个servlet可以指定一个映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
2.一个servlet指定映射多个映射
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
3.默认请求路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
4.优先级问题
指定了固有的映射路径,优先级最高,找不到就会走默认的处理请求
servletContex对象
web容器在启动的时候,他会为每个web程序创建一个对应的servletContext对象,他代表了当前的web应用;
- 共享数据(我在这个servlet程序中,可以传到其他srevlet程序中)
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String username= (String)servletContext.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print(username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String username= (String)servletContext.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print(username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.hua.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getServlet</servlet-name>
<servlet-class>com.hua.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getServlet</servlet-name>
<url-pattern>/getServlet</url-pattern>
</servlet-mapping>
访问结果:
- 获取初始化参数
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/</param-value>
</context-param>
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
PrintWriter writer = resp.getWriter();
writer.print(url);
}
- 请求转发
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
//RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/servletDemo03");//转发请求路径
//requestDispatcher.forward(req,resp);//调用forward实现转发
servletContext.getRequestDispatcher("/servletDemo03").forward(req,resp);
}
<servlet>
<servlet-name>servletDemo04</servlet-name>
<servlet-class>com.hua.servlet.ServletDemo04</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletDemo04</servlet-name>
<url-pattern>/servletDemo04</url-pattern>
</servlet-mapping>
- 读取资源文件
Properties - 在java目录下新建的properties
- 在resources目录下新建的properties
发现:都被打包到了同一路径下:classes我们统称为classpath
注意:java目录下需要配置pom文件,否则不能打包
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties properties = new Properties();
properties.load(resourceAsStream);
String username = properties.getProperty("username");
String password = properties.getProperty("password");
resp.getWriter().print("username="+username+";\npassword="+password);
}
HttpServletResponse下载文件
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletResponse对象,代表响应的一个HttpServletResponse;
- 如果要获取客户端请求来的参数,找HttpServletRequest;
- 如果想要客户端响应一些信息:找HttpServletResponse;
简单分类
负责向浏览器发送数据的方法:
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
负责向浏览器发送响应头大方法:
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
void setDateHeader(String var1, long var2);
void addDateHeader(String var1, long var2);
void setHeader(String var1, String var2);
void addHeader(String var1, String var2);
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);
响应的状态码常量
HttpServletResponse接口下
常见应用
1.向浏览器输出消息
2.下载文件
- 获取下载文件路径、下载文件名是啥、让浏览器支持我们下载的东西、
- 获取下载文件的输入流、创建缓冲区、获取OutputSteam对象、将FileOutputSteam写到缓冲区
- 使用OutputSteam将缓冲区中的数据输出到客户端
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//- 获取下载文件路径、
String realPath = "D:\\IdeaProjects\\javaweb-servlet02-maven\\response\\src\\main\\resources\\飞船.jpg";
System.out.println("下载文件的路径"+realPath);
//下载文件名是啥、
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
//让浏览器支持我们下载的东西、
resp.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));
//- 获取下载文件的输入流、
FileInputStream fileInputStream = new FileInputStream(realPath);
//创建缓冲区、
int let =0;
byte[] buffer = new byte[1024];
//获取OutputSteam对象、
ServletOutputStream outputStream = resp.getOutputStream();
//将FileOutputSteam写到缓冲区,使用OutputSteam将缓冲区中的数据输出到客户端
while((let=fileInputStream.read(buffer))>0){
outputStream.write(buffer,0,let);
}
fileInputStream.close();
outputStream.close();
}
验证码功能
验证码怎么来?:
- 前端实现
- 后端实现,需要用到java图片类,生成一个图片
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如何让浏览器3秒刷新一次
resp.setHeader("refresh","3");
//在内存中创建一个图片
BufferedImage bufferedImage = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
//得到图片
Graphics2D graphics = (Graphics2D) bufferedImage.getGraphics();//笔
//设置图片的背景颜色
graphics.setColor(Color.white);
graphics.fillRect(0,0,80,20);
//给图片写数据
graphics.setColor(Color.BLUE);
graphics.setFont(new Font(null,Font.BOLD,15));
graphics.drawString(getRandom(),0,20);
//告诉浏览器这个请求用浏览器打开
resp.setContentType("image/jpg");
//网站存在缓存 不让浏览器缓存
resp.setDateHeader("expires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","noache");
//把图片写给浏览器
ImageIO.write(bufferedImage,"jpg",resp.getOutputStream());
}
//生成随机数
private String getRandom(){
Random random = new Random();
String num = random.nextInt(99999999)+"";
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < 7-num.length(); i++) {
stringBuffer.append('0');
}
return num.toString()+stringBuffer;
}
实现重定向(重要)
一个web资源收到客户端请求后,他会通知客户端去访问另一个web资源,这个过程叫重定向
常用场景:用户登录
void sendRedirect(String var1) throws IOException;
面试题
重定向和转发的区别:
相同点:
都会实现页面跳转
不同点:
重定向会实现url的转变
转发不会
HttpServletRequest
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器;Http请求中的所有信息会被封装到HttpServletRequest,通过HttpServletRequest的方法,获得客户端的所有信息。
获取前端传递的参数,请求转发
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<h1>登录</h1>
<div style="text-align: center;">
<%--以post方式提交表单,提交到我们login请求--%>
<form action="${pageContext.request.contextPath}/loginServlet" method="post">
用户名:<input type="text" name="username"><br>
密码: <input type="password" name="password"><br>
爱好:
<input type="checkbox" name="hobbys" value="女孩">女孩
<input type="checkbox" name="hobbys" value="代码">代码
<input type="checkbox" name="hobbys" value="唱歌">唱歌
<input type="checkbox" name="hobbys" value="电影">电影
<br>
<input type="submit" name="submit">
</form>
</div>
</body>
</html>
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbys = req.getParameterValues("hobbys");
System.out.println("=======================================");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(hobbys));
System.out.println("=======================================");
//请求转发
//resp.sendRedirect("/request_war/success.jsp");
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
}
请求转发和重定向的区别
重定向和转发的区别:
相同点:
都会实现页面跳转
不同点:
重定向会实现url的转变 编码307
转发不会 编码302