JavaWeb
1.ASP、PHP、JSP
ASP:
-
微软:最早流行的就行ASP
-
在HTML嵌入VB的脚本
-
在ASP中,基本一个界面就有几千行代码,页面极其混乱,维护成本高
-
c#编程语言
-
IIS服务器
<h1> <% system.out.println("hello") %> <h1>
PHP
-
开发速度很快,功能很强大,跨平台,代码简单
-
无法承载大访问量的情况;(局限性)
JSP/Servlet
-
B/S:浏览和服务器
-
C/S:客户端和服务器
sun公司主推的B/S架构
基于Java语言(所有的大公司,一些开源的组件,都是Java写的)
可以承载三高带来的问题
语法像ASP,ASP->JSP,加强市场强度
2.请求方式:Get、Post、HEAD,DELETE,PUT,TRACT(微服务的时候会用到)
-
get:请求携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效。
-
post:请求携带的参数无限制,大小无限制,会在浏览器的URL地址栏显示数据内容,安全,但不高效。
3.响应状态码:
200:请求响应成功
3xx:请求重定向
- 重定向:重新到我给你指定的新位置去
4xx:找不到资源 404
5xx:服务器代码错误 500 502:网关错误
4.HTTP和HTTPS
Http:超文本传输协议,是一个简单的请求响应协议,通常运行在TCP上
-
文本:html,字符串
-
超文本:图片,音乐,视频,定位
-
端口号:80
-
两个时代
- http1.0:http/1.0:客户端可以与web服务器连接后,只能获得一个web资源,断开连接
- http2.0:http/1.1:客户端可以与多个web服务器连接后,可以获得多个web资源
Https:安全的
- 端口号:443
常见面试题:
当你的浏览器中地址栏输入地址并回车的一瞬间页面能够展示回来,经历的什么?
5.Maven
为什么学习这个技术?
1.在javaweb开发中,需要导入大量的jar包,我们手动去导入
2.如何让一个东西自动帮我导入和配置这个jar包,由此Maven诞生了
6.Servlet
- 简介:Servlet就是sun公司开发动态web的一门技术
- Sun在这些API中提供一个接口叫做:Servlet,有两个默认的实现类,HttpServlet
- 编写一个类,实现Servlet接口
- 把开发好的Java类部署到web服务器中
- 把实现了Servlet接口的Java程序叫做Servlet
HelloServlet
- 编写一个普通类
- 实现Servlet接口,这里我们直接继承HttpServlet
public class HelloServlet extends HttpServlet {
//由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//ServletOutputStream outputStream = resp.getOutputStream();
PrintWriter writer = resp.getWriter();//响应流
writer.print("Hello Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
3.编写Servlet的映射
为什么需要映射:我们写的Java程序需要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在Web服务中注册我们写的Servlet,还需要给它一个浏览器能够访问的路径
<!-- 注册Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.wyf.servlet.HelloServlet</servlet-class>
</servlet>
<!-- Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>helloServlet</url-pattern>
</servlet-mapping>
4.配置Tomcat
关于request和response的理解
1.request是代表HTTP请求信息的对象,response是代表HTTP响应信息的对象。
2.当浏览器发请求访问服务器中的某一个Servlet时,服务器将会调用Servlet中的service方法来处理请求。在调用service方法之前会创建出request和response对象。
3.其中request对象中封装了浏览器发送给服务器的请求信息(请求行、请求头、请求实体等),response对象中将会封装服务器要发送给浏览器的响应信息(状态行、响应头、响应实体),在service方法执行完后,服务器再将response中的数据取出,按照HTTP协议的格式发送给浏览器。
4.每次浏览器访问服务器,服务器在调用service方法处理请求之前都会创建request和response对象。(即,服务器每次处理请求都会创建request和response对象)
5.在请求处理完,响应结束时,服务器会销毁request和response对象。
Servlet原理
servlet是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器和 HTTP 服务器上的数据库的中间层。
优先级问题:指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求
7.ServletContext
Web容器在启动的时候,他会为每一个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用;
-
共享数据:我在这个Servlet中保存的数据,可以在另外一个servlet中拿到。
ServletContext是在上层,在不同的servlet中是通用的
ServletContext的属性通用,即setAttribute()和getAttribute(),会用session或者request一些方法代替ServletContext的属性通用
//web.xml
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.wyf.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getContext</servlet-name>
<servlet-class>com.wyf.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getContext</servlet-name>
<url-pattern>getc</url-pattern>
</servlet-mapping>
//需要先通过url请求hello给ServletContext属性赋值(key,value形式)
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String name = "王";
context.setAttribute("username",name);//将一个数据保存在ServletContext中,名字为:username,值name
}
}
//之后再通过url请求取出ServletContext中的值
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String) context.getAttribute("username");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
resp.getWriter().print("名字" + username );
}
}
ServletContext的请求转发
//获得转发路径,调用forward实现请求转发,url路径不会发生改变,但是重定向会发生改变
context.getRequestDispatcher("hello").forward(req,resp);
ServletContext的读取资源文件
Properties
- 在Java目录下新建properties,(可能会出现在target中classes目录下没有打包后的.properties文件,需要修改配置文件,修改过滤条件)
- 在resources目录下新建properties
发现:都被打包到了同一个路径下,classes,我们俗称这个路径为classpath
思路:需要一个文件流
db.properties文件内容
username=root
password=root
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream inputStream = this.getServletContext().getResourceAsStream("WEB-INF/classes/db.properties");
Properties prop = new Properties();
prop.load(inputStream);
String user = prop.getProperty("username");
String pwd = prop.getProperty("password");
resp.getWriter().print(user + pwd);
}
}
8.Response文件下载
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取文件下载的路径,1.png为项目工程resources目录下的一张图片
String realPath = this.getServletContext().getRealPath("/1.png");
//2.获取下载的文件名截取最后一个/,得到/后面的字符串就是文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
//3.想办法设置让浏览器能够支持(Content-Disposition)下载我们需要的东西
resp.setHeader("Content-Disposition","attachment;filename"+ URLEncoder.encode(fileName,"UTF-8"));
//4.获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
//5.创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
//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();
}
文件下载效果图如下:
9.Response验证码功能(不重要)
验证怎么来的?
-
前端实现
-
后端实现
public class ImageServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //如何让浏览器3秒自动刷新一次 resp.setHeader("refresh","3"); //在内存中创建图片 BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB); //得到图片 Graphics2D graphics = (Graphics2D) image.getGraphics();//笔 //设置图片的背景颜色 graphics.setColor(Color.white); graphics.fillRect(0,0,80,20); //给图片写数据 graphics.setColor(Color.BLUE); graphics.setFont(new Font(null,Font.BOLD,20)); graphics.drawString(makeNum(),0,20); //告诉浏览器,这个请求用图片的方式打开 resp.setContentType("image/jpg"); //网站存在缓存,不让浏览器缓存 resp.setDateHeader("expires",-1); resp.setHeader("Cache-Control","no-cache"); resp.setHeader("Pragma","no-cache"); //把图片写给浏览器 boolean write = ImageIO.write(image,"jpg",resp.getOutputStream()); } //生成随机数 private String makeNum(){ Random random = new Random(); String num = random.nextInt(9999999 ) + ""; StringBuffer sb = new StringBuffer(); //for循环是为了保证随机数的位数为7位,for循环是重点 for (int i = 0; i < 7-num.length();i++){ sb.append("0"); } num = sb.toString() + num; return num; } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
效果图如下:
10.实现重定向
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
resp.setHeader("Location","/img");
resp.setStatus(302);
*/
resp.sendRedirect("/img");//重定向
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
面试题:请你聊聊重定向和转发的区别?
相同点
- 页面都会实现跳转
不同点
- 请求转发的时候,url不会发生变化 状态码:307
- 重定向的时候,url地址栏会发生变化 状态码:302
重定向常见场景:
-
用户登录
get方式
void sendRedirect(String var1) throws IOException;
post方式
11.Cookie、Session(保存会话的两种技术)
会话:用户打开一个浏览器,点击了很多超链接,访问了多个web资源,关闭浏览器,这个过程可以称之为会话。
一个网站,怎么证明你来过?
客户端 服务端
1.服务端给客户端一个信件,客户端下次访问带上信件就可以了:cookie
2.服务端登记你来过了,下次你来的时候我匹配你:session
- Cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。
- 从请求中拿到cookie信息
- 服务器响应给客户端cookie
cookie的细节
-
一个cookie只能保存一个信息,每个cookie大小上限为4kb
-
一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
-
300个cookie浏览器上限
-
删除cookie:不设置有效期,关闭浏览器,自动失效,或者设置有效时间为0
-
虽然在一定程度上解决了“保持状态”的需求,但是由于cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是session。
12.Session(重点)
什么是Session:
- 服务器会给每一个用户(浏览器)创建一个Session对象
- 一个Session独占一个浏览器,只要浏览器没有关,这个Session就存在
- 用户登录之后,整个网站它都可以访问。保存用户的信息,保存购物车的信息
一个浏览器对应一个SessionId,不同浏览器的SessionId不同,相同浏览器的SessionId相同
Session的使用
13.Session和Cookie的区别
- Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
- Session是把用户的数据写到用户独占Session中,服务端保存(保存重要的信息,减少服务器资源的浪费)
- Session对象由服务器创建
使用场景:
- 保存一个登录用户的信息
- 购物车信息
- 在整个网站中经常会使用的数据,我们将它保存在Session中
ServletContext可以存取不同用户中的数据,Session只能存取当前用户数据,ServletContext后期改名为ApplicationContext
14.JSP
Java Server Pages:Java服务器端界面,也和servlet一样,用于动态Web技术
最大的特点:
- 写JSP就像是在写HTML
- 区别
- HTML只提供给用户静态数据
- JSP中可以嵌入JAVA代码,为用户提供动态数据
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet
JSP最终也会转变为一个Java类,JSP本质就是一个Servlet
15.JavaBean特定写法
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的getter/setter方法
一般用来和数据库的字段做映射 ORM;
ORM:对象映射关系
- 表—>类
- 字段—>属性
- 行记录—>对象
16.MVC三层架构
微服务之前都是这个架构,MVC三层架构
Model层
- 业务处理:业务逻辑(Service)
- 数据持久层:CRUD(Dao)
View层
- 展示数据
- 提供链接发送Servlet请求(a、form、img…)
Controller层(Servlet)
-
接收用户的请求(req:请求参数、Session信息…)
-
交给业务层处理对应的代码
-
控制视图的跳转
17.Filter(重点)
1.Filter:过滤器,用来过滤网站的数据;
- 处理中文乱码
- 登录验证…
2.编写过滤器
-
导包不要错
-
实现Filter接口
public class CharacterEncodingFilter implements Filter {
//初始化:Web服务器启动,就已经初始化了,随时等待过滤对象出现
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=UTF-8");
/*
filterChain:过滤器链
1.过滤中的所有代码,在过滤特定请求的时候都会执行
2.必须要让过滤器继续同行
*/
System.out.println("CharacterEncodingFilter执行前");
filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走,如果不写,程序到这里就被拦截停止
System.out.println("CharacterEncodingFilter执行后");
}
//销毁:Web服务器关闭的时候,过滤会销毁
@Override
public void destroy() {
}
}
- 在web.xml中配置Filter
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.wyf.Filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!--只要是/servlet/...的任何请求,都会经过这个过滤器-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
18.用Filter进行简单的未登录拦截
实现一个过滤器,判断用户Session的属性是否存在(登录成功后给Session赋值),不存在重定向错误界面
19.JDBC
什么是jdbc?Java连接数据库
jdbc的ACID四个特性,原子性,一致性,隔离性,持久性
Java代码中一定要通知数据库开启事务
20.超市订单管理系统-实战(部分代码)
1.数据库配置文件db.properties
2.连接数据库
3.写一个乱码公共过滤器