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只是请求实现的不同的方式,可以相互调用,业务逻辑都一样@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//ServletOutputStream outputStream = resp.getOutputStream();PrintWriter writer = resp.getWriter();//响应流writer.print("Hello Servlet");}@Overrideprotected 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 {@Overrideprotected 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 {@Overrideprotected 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 {@Overrideprotected 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 {@Overrideprotected 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 {@Overrideprotected 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;}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }效果图如下:

10.实现重定向

public class RedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {/*resp.setHeader("Location","/img");resp.setStatus(302);*/resp.sendRedirect("/img");//重定向}@Overrideprotected 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服务器启动,就已经初始化了,随时等待过滤对象出现@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic 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服务器关闭的时候,过滤会销毁@Overridepublic 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.写一个乱码公共过滤器



















