首页 > 编程语言 > 详细

Java WEB 入门到实战

时间:2021-01-09 23:19:16      阅读:26      评论:0      收藏:0      [点我收藏+]

WEB概念

基本概念

  • web 开发

    • web:网页
    • 静态web
      • html css
      • 提供给所有人看的数据始终不会发生改变
    • 动态web
      • 提供给所有人看的数据会发生改变,每个人在不同的时间,不同的地点看到的信息各不相同
      • 技术栈 Servlet/JSP, ASP,PHP

    在Java中,动态web资源开发的技术 统称为 javaWeb

web应用程序

  • web应用程序,可以提供浏览器访问的程序;
  • 多个web资源,可以被外界访问,多外界提供服务
  • URL
  • 统一的web资源会被放在同一个文件夹下,web应用程序->Tomcat:服务器
  • 一个web应用有多部分组成(静态web,动态web)
    • html,css,js
    • jsp,servlet
    • Java程序
    • jar包
    • 配置文件(Properties)
  • web应用程序编写完以后,若想提供给外界访问,需要一个服务器来统一管理

静态web

  • .html,.htm 这些都是网页的后缀,如果服务器存在这些文件,就可以直接进行读取,通络
  • 静态web存在的缺点:
    • web页面无法动态更新,所有用户看到都是同一个页面
      • 轮播图,点击特效:伪动态
      • JavaScript
      • VBScript
    • 他无法和数据库交互(数据无法持久,用户无法交互)

动态web

  • 页面会动态展示:WEB的页面展示的效果 因人而异
  • 缺点:
    • 加入服务器的动态web资源出现了错误,需要重新编写后台程序,重新发布
    • 停机维护
  • 优点
    • web页面无法动态更新,所有用户看到不是同一个页面
    • 数据库交互(数据持久化)

WEB服务器

web技术

  • ASP

    • 微软:国内最早流量的就是Asp
    • 在HTML中嵌入了VB的脚步,ASP+COM
    • 在ASP开发中,页面臃肿,极其混乱
    • 维护成本高
    • C#
    • IIS
  • PHP

    • 开发速度快,功能强大,跨平台,代码简单
    • 无法承受大访问量(局限性)
  • JSP/Servlet

    • B/S:浏览器和服务器
    • C/S 客户端和服务器
      • sun公司主推的B/S架构
      • 基于java语言的(所有的大公司或一些开源的组件,都是java写的)
      • 语法像ASP,ASP->JSP,加强市场强度

web服务器

  • 服务器是一种被动操作,用来处理用户的一些 请求和用户的一些响应的信息
  • IIS
    • 微软的,ASP……windows自带的
  • Tomcat
    • 面向百度编程
    • Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
    • Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,是最佳的选择
    • Tomcat 实际上运行JSP 页面和Servlet。目前Tomcat最新版本为9.0.41
    • 工作年限就一些之后,可以尝试手写Tomcat服务器
    • 下载tomcat
      • 安装 or 解压
      • 了解配置文件及目录结构
      • Tomcat的作用

Tomcat

配置

  • config.server.xml
  • 配置端口号 port,默认端口号为8080
    • mysql 3306
    • http 80
    • https 443
  • 配置主机名称
    • host
    • 默认主机名称为:localhost-》127.0.0.1
    • 默认网址应用存放的位置为:webapps
  • 发布一个web网站
    • 放到Tomcat 指定的web应用中,webapps

HTTP

maven

  • javaweb中需要大量的导入jar包

  • Maven 项目架构管理工具

    • 目前用来方便导入jar包
    • Maven的核心思想:约定大约配置
      • 有约束,不要去违反
  • Maven 环境配置

    • M2_HOME Maven目录下的bin目录
    • MAVEN_HOME maven的目录
  • Maven 阿里云镜像

  • <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>
    

HelloServlet

  • Servlet就是sun公司开发动态web的一门技术

  • servlet 接口sun公司有两个默认的实现类:HttpServlet

  • sun在这些api中提供一个接口叫做:servlet,想要开发一个servlet程序,只需要完成两个小步骤

    • ? 编写一个类,实现Servlet接口
    • ? 把开发好的java类部署到web服务器中
  • 实现了servlet接口的程序叫做Servlet

  • 关于父子工程:

    • 父项目中会有

    • <models>
      	<modult>servlet-01</modult>
      </models>
      
    • 子项目会有

    • <parent>
      	<artifactid>javaweb-01</artifactid>
        <groupId>com.liu</groupId>
        <version>1.0-SNAPSHOT</version>
      </parent>
      
    • 父项目中的java子项目可以直接使用

Servlet 原理

Servlet 是由web服务器调用,web服务器在收到浏览器请求之后:会

技术分享图片

Maping

  • 一个Servlet可以指定一个映射路径

  • <servlet-mapping>
      <servlet-name>hello</servlet-name>
      <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    
  • 一个Servlet可以指定多个映射路径

  • 一个Servlet可以指定通用映射路径

  • Servlet 可以自定义映射路径

//注册Servlet 
<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.liu.servlet.HelloServlet</servlet-class>
  </servlet>
  • 优先级问题
    • 指定固有的映射路径优先级最高,如果找不到就找默认请求

ServletContext

  • web容器在启动的时候,他会为每个web程序创建一个对应的ServletContext对象,它代表了当前的web应用

    • 共享数据

    • package com.liu.servlet;
      
      import javax.servlet.ServletContext;
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      import java.io.PrintWriter;
      
      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.setContentType("text/html");
              resp.setCharacterEncoding("utf-8");
              PrintWriter writer = resp.getWriter();
              writer.print(userName);
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              super.doGet(req, resp);
          }
      }
      
      
    • package com.liu.servlet;
      
      import javax.servlet.ServletContext;
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      import java.io.PrintWriter;
      
      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.setContentType("text/html");
              resp.setCharacterEncoding("utf-8");
              PrintWriter writer = resp.getWriter();
              writer.print(userName);
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              super.doGet(req, resp);
          }
      }
      
      
    • <?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"
               metadata-complete="true">
          
          <servlet>
              <servlet-name>hello</servlet-name>
              <servlet-class>com.liu.servlet.HelloServlet</servlet-class>
          </servlet>
          
          <servlet-mapping>
              <servlet-name>hello</servlet-name>
              <url-pattern>/hello</url-pattern>
          </servlet-mapping>
      
          <servlet>
              <servlet-name>getc</servlet-name>
              <servlet-class>com.liu.servlet.GetServlet</servlet-class>
          </servlet>
      
          <servlet-mapping>
              <servlet-name>getc</servlet-name>
              <url-pattern>/getc</url-pattern>
          </servlet-mapping>
      
      </web-app>
      

Response

web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应一个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);//响应类型

常见应用

  • 向浏览器输出消息

  • 下载文件

    • 获取文件的路径

    • 下载文件名是啥

    • 设置让浏览器支持下载需要的东西

    • 获取下载文件的输入流

    • 创建缓存区,获取OutputStream对象

    • 将FileOutputStream流写入到buffer缓冲区

    • 使用OutputStream将缓存区输出到客户端

    • package com.liu.servlet;
      
      import javax.servlet.ServletException;
      import javax.servlet.ServletOutputStream;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.FileInputStream;
      import java.io.IOException;
      import java.net.URLEncoder;
      
      public class FileServlet extends HttpServlet {
      
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //        String path = "/Applications/MAMP/JavaDemo/javeweb-maven-01/response/src/main/resources/1.png";
              String realPath ="/Applications/MAMP/JavaDemo/javeweb-maven-01/response/src/main/resources/1.png";
              System.out.println("下载文件的路径" + realPath);
              String fileName = realPath.substring(realPath.lastIndexOf("//") + 1);
              resp.setHeader("Content-disposition", "attachment;fileName=" + URLEncoder.encode(fileName,"utf-8"));
              FileInputStream in = new FileInputStream(realPath);
              int len = 0;
              byte[] buffer = new byte[1024];
              ServletOutputStream outputStream = resp.getOutputStream();
              while ((len = in.read(buffer)) > 0) {
                  outputStream.write(buffer, 0, len);
              }
              outputStream.close();
              in.close();
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req, resp);
          }
      }
      

Response 验证码实现

package com.liu.servlet;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

public class ImageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setHeader("refresh", "3");

        BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);

        Graphics2D g = (Graphics2D) image.getGraphics();
        g.setColor(Color.white);
        g.fillRect(0, 0, 80, 20);
        g.setColor(Color.BLUE);
        g.setFont(new Font(null, Font.BOLD, 20));
        g.drawString(makeNum(), 0, 20);

        resp.setContentType("image/jpg");
        resp.setDateHeader("expires", -1);
        resp.setHeader("Cache-Control", "no-cache");
        resp.setHeader("Pragma", "no-cache");

        ImageIO.write(image, "jpg", resp.getOutputStream());
    }

    private String makeNum() {
        Random random = new Random();
        String num = random.nextInt(9999999) + "";
        StringBuffer sb = new StringBuffer();
        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);
    }
}

Response 重定向

一个web资源收到客户端请求后,他会通知其他客户端请求另外一个资源,这个过程叫重定向

package com.liu.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       resp.sendRedirect("/r2/img");
    }
}

Request

HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会封装到HttpServletRequest,通过HttpServletRequest的方法,获得了客户端所有的信息

获取传递的参数

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String username = req.getParameter("username");
    String password = req.getParameter("password");
    String[] hobbys = req.getParameterValues("hobbys");

    req.getRequestDispatcher("/success.jsp").forward(req,resp); //请求转发
}

Cookie/Session

会话

  • 会话:用户打开一个浏览器,点击了很多链接,访问了多个web资源,关闭浏览器,这个过程,可以称之为会话

保存会话的两种技术

  • cookie

    • 客户端技术(响应,请求)

    • 从请求中拿到了cookie信息

    • 服务器响应给客户端cookie

    • Cookie[] cookies = req.getCookies();//返回数组
      cookie.getName();//获得cookie中的key
      cookie.getValue();//获取的cookie的val
      new Cookie("lastLoginTime", System.currentTimeMillis() + ""); //new cookie 
      cookie.setMaxAge(24 * 60 * 60); //cookie 过期时间
      resp.addCookie(cookie);//响应cookie
      
    • 一般会报错在本地的,用户目录下,appdata

    • 浏览器cookie上线300个,每个站点最多200cookie,cookie 大小限制 4KB

  • session

    • 服务器技术,利用这个技术,可保存用户的会话信息,可以把信息或数据放到Session中
    • 服务器会给每个用户(浏览器)来创建一个session对象
    • 一个session独占一个浏览器,只要浏览器没有关闭,这个session就存在

JSP原理剖析

什么是JSP

  • java server pages: java服务端页面,也和Servlet一样,用于动态web技术
  • 最大特点:
    • 写JSP就想写HTML 一样
    • HTML只给用户提供静态数据
    • JSP页面中可以嵌入JAVA代码,为用户提供动态数据

JSP 原理

  • tomcat 中有个work目录;
  • IDEA中使用Tomcat,会在Tomcat中生产一个work目录
  • 浏览器向服务器发送请求,不管访问什么资源,其实就是在访问servlet
  • JSP最终也会被转成一个java类

JSP基础语法 和 指令

任何语言都有自己的语法,java中有jsp作为java技术的一种应用,他拥有一些自己的扩充语法,java所有语法都支持

jsp表达式

<%--
作用:用来将程序输出到客户端
<%= 变量或者表达式%>
--%>
<%= new java.util.Date()%>

JSP脚本

<%--jsp脚本片段--%>
<%
    int sum = 0;
    for (int i = 0; i < 50; i++) {
        sum += i;
    }
    out.println("<h1>Sum="+sum+"</h1>");
%>

JSP 内置对象及作用域

  • PageContext
  • Request
  • Response
  • Session
  • Application 【servletContext】存数据
  • config[servletConfig]
  • out
  • page
  • exception

JSP JSTL标签 EL 表达式

EL表达式 ${}

  • 获取数据
  • 执行运算
  • 获取web开发的常用对象

jsp 标签

<jsp:include page="index.jsp"></jsp:include>
<jsp:forward page="/index.jsp">
    <jsp:param name="qq" value="www"/>
</jsp:forward>

jstl标签

  • JSP标准标签库就是为了弥补HTML标签的不足;它自定义许多标签,可以供我们使用,标签功能和java代码一样

核心标签

  • 核心标签是最常用的 JSTL标签

  • <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    标签 描述
    <c:out> 用于在JSP中显示数据,就像<%= ... >
    <c:set> 用于保存数据
    <c:remove> 用于删除数据
    <c:if> 与我们在一般程序中用的if一样
    <c:url> 使用可选的查询参数来创造一个URL
    <c:choose> 本身只当做<c:when>和<c:otherwise>的父标签
    <c:when> <c:choose>的子标签,用来判断条件是否成立
    <c:otherwise> <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行
    <c:foreach> 基础迭代标签,接受多种集合类型

JavaBen

  • 实体类
  • JavaBean有特定的写法
    • 必须有个无参构造
    • 属性必须私有化
    • 必须有对应的get/set方法
  • 一般用来和数据库的字段做映射 ORM

MVC三层架构

什么是MVC

  • Model 模型
    • 控制业务操作,增删改查
  • view 视图
    • 展示数据
    • 提供可以供我们操作的请求
  • Controller 控制器
    • 接收用户的请求
    • 响应给客户端内容
    • 重定向或转发

过滤器Filter

  • Filter:过滤器,用来过滤网站的数据

    • 处理中文乱码
    • 处理验证
    package com.liu.filter;
    
    import javax.servlet.*;
    import java.io.IOException;
    
    public class CharacterEncodingFilter implements Filter {
    
    
        //初始化
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("CharacterEncodingFilter初始化");
        }
    
        /**
         * chain : 链
         *
         * 过滤中所有的代码,在过滤特定请求的时候都会执行
         * 必须让过滤器继续通行
         *  chain.doFilter(request, response);
         *
         * @param request
         * @param response
         * @param chain
         * @throws IOException
         * @throws ServletException
         */
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            request.setCharacterEncoding("utf-8");
            response.setCharacterEncoding("utf-8");
            response.setContentType("text/html");
            System.out.println("CharacterEncodingFilter执行前");
            chain.doFilter(request, response);//让请求继续执行,如果不写,程序将被拦截停止
            System.out.println("CharacterEncodingFilter执行后");
        }
    
        //销毁
        @Override
        public void destroy() {
            System.out.println("CharacterEncodingFilter销毁");
        }
    }
    
<?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"
         metadata-complete="true">
    <servlet>
        <servlet-name>showServlet</servlet-name>
        <servlet-class>com.liu.servlet.ShowServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>showServlet</servlet-name>
        <url-pattern>/servlet/showServlet</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>showServlet</servlet-name>
        <url-pattern>/showServlet</url-pattern>
    </servlet-mapping>
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.liu.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <!--    只要是/servlet 的任何请求,都会被拦截    -->
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>
</web-app>

JDBC

什么是JDBC?

  • java 连接数据库
  • jar包支持:
    • java.sql
    • javax.sql
    • mysql-conneter-java…… 连接驱动
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.22</version>
</dependency>
package com.liu.servlet;

import java.sql.*;

public class TestJdbc {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        String url = "jdbc:mysql://localhost:3306/eesy?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8";
        String username = "root";
        String password = "root";

        Class.forName("com.mysql.jdbc.Driver");

        Connection connection = DriverManager.getConnection(url, username, password);
        Statement statement = connection.createStatement();

        String sql1 = "delete from user where id = 1";
        statement.executeUpdate(sql1);//增删改


        String sql = "select * from user";
        ResultSet resultSet = statement.executeQuery(sql);//查询
        

        String sql2 = "insert into (id,name,birthday)values (?,?,?)";
        PreparedStatement preparedStatement = connection.prepareStatement(sql2);//预编译
        preparedStatement.setInt(1, 2);
        preparedStatement.setString(2, "aaa");
        preparedStatement.setDate(3, new Date(new java.util.Date().getTime()));

        preparedStatement.executeUpdate();


        while (resultSet.next()) {
            System.out.println("id=" + resultSet.getObject("id"));
            System.out.println("username=" + resultSet.getObject("username"));
            System.out.println("birthday=" + resultSet.getObject("birthday"));
            System.out.println("sex=" + resultSet.getObject("sex"));
            System.out.println("address=" + resultSet.getObject("address"));
        }

        resultSet.close();
        statement.close();
        connection.close();

    }
}

事务

  • 要么都成功,要么都失败
  • ACID原则:保证数据的安全
  • 事务特性
    • 原子性 (atomicity):强调事务的不可分割.
    • 一致性 (consistency):事务的执行的前后数据的完整性保持一致.
    • 隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰
    • 持久性(durability) :事务一旦结束,数据就持久到数据库
  • 事务运行模式
    • 自动提交事务:默认事务管理模式。如果一个语句成功地完成,则提交该语句;如果遇到错误,则回滚该语句。
    • 显式事务:以BEGIN TRANSACTION显式开始,以COMMIT或ROLLBACK显式结束。
    • 隐性事务:当连接以此模式进行操作时,sql将在提交或回滚当前事务后自动启动新事务。无须描述事务的开始,只需提交或回滚每个事务。它生成连续的事务链。

Java WEB 入门到实战

原文:https://www.cnblogs.com/LiuMiao1128/p/14256155.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!