# JavaWeb *** ## 1、基本概念 *** ### 1.1、前言 web开发: * web,网页的意思,www.baidu.com * 静态web * html,css * 提供给所有人看的数据始终不会发生变化! * 动态web * 淘宝,几乎是所有的网站; * 提供给所有人看的数据始终会发生变化! * 技术栈:Servlet/JSP,ASP,PHP 在Java中,动态web资源开发的技术统称为JavaWeb ### 1.2、web应用程序 web应用程序:可以提供浏览器访问的程序 * a.html,b.html.........多个web资源,可以被外界访问,对外界提供服务; * 资源存在物理机上面 * URL * 统一的web资源会被放在同一个文件夹下,web应用程序 * 一个web应用由多部分组成 * html,css,js * jsp,servlet * java程序 * jar包 * 配置文件(properties) web应用程序编写完毕后,若想提供给外部访问;需要一个服务器来统一管理; ### 1.3、静态web * *.htm,*.html,这些都是网页的后端,如果服务器上一直存在这些东西,我们就可以直接进行读取 ![image-20211112143650663](assets/image-20211112143650663.png) * 静态web存在的缺点 * 微博页面无法动态更新,所有用户看到都是同一个页面 * 轮播图,点击特效:为动态 * javascript * 无法与数据库交互 ### 1.4、动态web 页面会动态展示:“展示效果因人而异” ![image-20211112145114932](assets/image-20211112145114932.png) 缺点 * 如果服务器的动态web资源出现了错误,我们需要重新编写我们的后台程序,重新发布; * 停机维护 优点 * web页面可以动态更新 * 可以与数据库交互 ## 2、web服务器 *** ### 2.1、技术讲解 ASP * 微软 * 在HTML中嵌入了VB脚本 PHP * 开发速度很快,功能强大,跨平台,代码简单 * 无法承载大访问量的情况 JSP/Servlet: * sun公司主推的B/S架构 * 基于Jva语言 * 可以承载三高问题带来的影响 ### 2.2、web服务器 服务器是一种被动操作,用来处理用户的一些请求和用户一些相应信息; IIS **Tomcat** ## 3、Tomcat *** 1. JAVA环境必须有 2. 乱码:修改命令行编码为UTF-8 xml文件可以配置 * 端口号 * 主机名称 * 应用的存放位置 访问网站: 1. 输入域名 2. 检查本机hosts 3. 访问DNS服务器 ## 4、Servlet *** ### 4.1、Servlet简介 * Servlet就是sun公司开发动态web的一门技术 * sun在这些API中提供了一个接口叫做:Servlet * 编写一个类实现这个接口 * 开发好的类部署到web服务器中 ### 4.2、HelloServlet 1. 构建一个主工程 2. 关于maven父子工程的理解: 父项目中会有一个 ``` servlet01 ``` 子项目中会有一个 ``` ``` 父项目中的java子项目可以直接引用 3. 编写一个servlet类,继承HttpServlet接口 ``` public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 响应流 PrintWriter writer = resp.getWriter(); writer.print("Hello,Servlet"); } } ``` 4. 为什么编写Servlet的映射 我们写的是JAVA程序,但是需要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的servlet,还需给他一个浏览器能够访问的路径 ``` Hello com.servlet.HelloServlet Hello /hello ``` 5. 配置Tomcat ![image-20211112211142264](assets/image-20211112211142264.png) ### 4.3、Servlet原理 Servlet是由web服务器调用,web服务器在收到浏览器请求之后,会: ![image-20211113134002803](assets/image-20211113134002803.png) ### 4.4、Mapping问题 1. 一个Servlet可以指定一个映射路径 ``` Hello /hello ``` 2. 一个Servlet可以指定多个映射路径 ``` Hello /hello1 Hello /hello2 ``` 3. 一个Servlet可以指定通用映射路径------servlet优先级较高,会覆盖默认请求 ``` Hello /hello/* ``` 4. 指定一些后缀或者前缀 ``` Hello *.do ``` 5. 默认请求路径------少用 ``` Hello /* ``` 6. 优先级问题 指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求。 ### 4.5、ServletContext web容器在启动的时候,他会为每个web程序都创建一个对应的ServletContext对象,他代表了当前的web应用; #### 4.5.1、共享数据 servlet中保存的数据,在另外的servlet可以拿到。 ``` ServletContext servletContext = this.getServletContext(); servletContext.setAttribute("userName", userName); String userName = (String) servletContext.getAttribute("userName"); ``` #### 4.5.2、获取初始化参数 ```java ServletContext servletContext = this.getServletContext(); String url = servletContext.getInitParameter("url"); resp.getWriter().print(url); ``` #### 4.5.3、请求转发 ```java this.getServletContext().getRequestDispatcher("/gp").forward(req,resp); ``` ![image-20211113145845150](assets/image-20211113145845150.png) 通过这张图你就可以看到,转发是在服务器之间进行的,它的意思虽然我没有你想要的资源但是我可以帮你找到, 重定向是告诉你,我Servlet1没有这个资源,但是我告诉你那里有,你自己通过浏览器去找, #### 4.5.4、读取资源文件 maven由于他的约定大于喷子hi,我们写的配置文件,可能无法被到处或者生效,解决方法 ``` src/main/resources **/*.properties **/*.xml false src/main/java **/*.properties **/*.xml false ``` Properties 发现都被打包到了同一个路径下:classes,我们俗称为classpath 通过文件流读取。 ### 4.6、HttpServletResponse webn服务器接收到客户端的http请求,针对请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse * 如果要获取客户端请求过来的参数:HttpServletRequest * 如果要找客户端响应的一些信息:HttpServletResponse #### 4.6.1、常用应用 1. 输出信息 2. 下载文件 1. 获取下载文件的路径 2. 下载的文件名 3. 设置让浏览器能够支持我们需要的东西 4. 获取下载文件的输入流 5. 创建缓冲区 6. 获取OutputStream对象 7. 将OutputStream写入缓冲区 8. 将缓冲区写入磁盘 3. 验证码功能 验证怎么来的? * 前端实现 * 后端实现,需要用到java的图片类,产生一个图片 4. 重定向 ![image-20211113164517356](assets/image-20211113164517356.png) 常见场景: * 用户登录 ``` // 需要设置改项目的路径 resp.setHeader("Location", "/r/image"); resp.setStatus(HttpServletResponse.SC_FOUND); ``` 重定向和转发区别? 相同点: * 界面都会实现改变 不同点: * 一个是web服务器 * 一个是浏览器 * 转发会加上项目路径,而重定向不会 * 重定向:302 * 转发:307 ### 4.7、HttpServletRequest HttpServletRequest代表客户端的请求,用户通过http服务请求都被封装到Request下面。 1. 获取前端请求的参数 2. 转发请求 ```java req.getRequestDispatcher("/image").forward(req,resp); ``` ## 5、Cookie、Session *** ### 5.1、会话 会话:用户打开一个浏览器,点击了很多超链接,访问了多个web资源,关闭浏览器,这个过程称之为会话。 有状态会话:保存上次会话的状态 怎么证明自己是西电学生? 1. 发票 2. 登记 一个网站,怎么证明你来过? 客户端 服务端 1. 服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了:cookie 2. 服务器登记你来过了,下次你来的时候我来匹配你:session ### 5.2、保存会话的两种技术 cookie * 客户端技术(响应,请求) session * 服务器技术,利用这个技术,可以保存用户的会话信息!我们可以把信息或者数据放入session 常见场景:网站登录之后,下次不需要登录 ### 5.3、cookie 1. 从请求中拿到cookie信息 2. 服务器响应给客户端cookie ``` Cookie[] cookies = req.getCookies(); ``` 3. 一般会保存在本地目录下 一个网站cookie是否存在上限 * 一个cookie只能保存一个信息 * 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie * 300个浏览器上限 * cookie大小有限制4kb 删除cookie; * 不设置有效期,关闭浏览器,自动失效; * 有效期设置为0,自动消失 ### 5.4、Session(重点) 什么是session: * 服务器会给每一个用户(浏览器创建一个)session对象 * 一个session独占一个浏览器,只要浏览器没有关闭,这个session就存在 * 用户登录之后,整个网站都可以访问!保存用户的信息;保存购物车的信息 session和cookie的区别: * cookie是浏览器保存(可以保存多个) * session是用户独占,服务器端保存(保存重要信息,减少服务器资源浪费) * session对象是由服务器创建 session使用场景: * 保存一个登录用户的信息 * 购物车信息: * 整个网站中经常会使用的数据 ## 6、JSP *** ### 6.1、什么是JSP? java server pages:java服务器端界面,也和servlet一样,用于动态web技术 最大的特点: * 写JSP就像写HTML * 区别 * HTML只给用户提供静态数据 * JSP页面中可以嵌入JAVA代码,为用户提供动态数据 ### 6.2、JSP原理 * 代码层面没有任何问题 * 服务器内部工作 tomcat中有一个work目录 IDEA中使用tomcat开发会在idea中生成一个work目录 * 浏览器向服务端发送请求,不管访问什么请求,其实都是在访问servlet * JSP最终会转换为java类 * JSP本质还是一个servlet 1. 判断请求 2. 内置一些对象 ```java final javax.servlet.jsp.PageContext pageContext; // 页面上下文 javax.servlet.http.HttpSession session = null; // session final javax.servlet.ServletContext application; // applicationcontext final javax.servlet.ServletConfig config; //配置 javax.servlet.jsp.JspWriter out = null; // out final java.lang.Object page = this; // page当前页 ``` 3. 输出页面前增加的代码 ```java response.setContentType("text/html"); // 响应类型 pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; ``` 4. 以上这些对象我们在JSP页面中直接使用 * 在JSP页面中: 如果是JAVA代码就会被原封不动的输出 如果是HTML代码就会被转换为out.write("

")这样的格式渲染到前端 * 原理图 ![image-20211114185115260](assets/image-20211114185115260.png)