javaWeb学习笔记2

一、Idea中编写Java web项目

在这里插入图片描述

1、建立tomcat和idea的关联

在这里插入图片描述

2、使用idea创建一个javaWEB工程

  • 创建一个空项目之后
    在这里插入图片描述

在这里插入图片描述
去搜索框里面搜索‘’添加框架支持‘’,添加Web组件。
在这里插入图片描述
在这里插入图片描述

javaWEB工程构建完成!

3、使用idea将工程构建成一个可以发布的app

在这里插入图片描述

4、使用idea将构建好的app部署到tomcat中启动运行

在这里插入图片描述

二、Servlet

2-1 概念

  • Servlet 是Java提供的一门动态web资源开发技术
  • Servlet 是JavaEE 规范之一,其实就是一个接口,定义Servlet类实现Servlet接口,并由web服务器运行Servlet

2-2 Request&Response

Request

  • Request 继承体系
    在这里插入图片描述

Tomcat需要解析请求数据,封装为request对象并且创建request对象传递到service方法中
使用request对象,查阅JavaEE API文档的HttpServletRequest接口

  • Request 获取请求数据
    所有请求数据分为3部分

    1. 请求行
    //获取请求方式:get
            String method = req.getMethod();
            System.out.println(method);
    
            //getcontextPath():获取虚拟目录(项目访问路径)
            String contextPath = req.getContextPath();
            System.out.println(contextPath);
    
            //getRequestURL():获取URL(统一资源定位符):
            StringBuffer requestURL = req.getRequestURL();
            System.out.println(requestURL);
    
            //getRequestURL():获URL(统一资源标识行):
            String requestURI = req.getRequestURI();
            System.out.println(requestURI);
    
            //getQuerystring():获取消求参数(GET方式):
            String queryString = req.getQueryString();
            System.out.println(queryString);
    
    1. 请求头:
    String header = req.getHeader("user-agent");
    System.out.println(header);
    
    1. 请求体:
    BufferedReader reader = req.getReader();
    String s = reader.readLine();
    System.out.println(s);
    
  • Request 通用方式获取请求参数

    思考:
    GET 请求方式 和 POST请求方式 区别主要在于获取请求参数的方式不一样(String getQueryString()、BufferedReader getReader()),是否可以提供一种统一获取请求参数的方式,从而统一doGet和 doPost方法内的代码?
    回答:
    Request 首先通过不同的请求方式解析参数之后,再都使用Map集合存储请求数据的参数

在这里插入图片描述
Request 请求获取参数值的通用方法:

			//1.Map集合获取参数值
	        Map<String, String[]> parameterMap = req.getParameterMap();
	        for(String key:parameterMap.keySet())
	        {
	            System.out.println(key+":");
	
	            //获取值  由于一个key里面可能存在多个值,所有获取的value是String[]型
	            String[] strings = parameterMap.get(key);
	            for (String s:strings)
	            {
	                System.out.println(s+" ");
	            }
	            System.out.println();
	        }
	
	        //2.根据key获取参数值,数组
	        String[] parameterValues = req.getParameterValues("hobby");
	        for (String s:parameterValues)
	            System.out.println(s+" ");
	
	        //3.根据key获取单个参数值
	        String username = req.getParameter("username");
	        System.out.println(username);
  • Request 请求转发
    请求转发(forward):一种在服务器内部的资源跳转方式

    演示:

    req.setAttribute("name","lee");
            req.getRequestDispatcher("转发的目的的路径").forward(req,resp);
    

在这里插入图片描述

乱码问题

  • POST乱码问题
//解决乱码
        req.setCharacterEncoding("UTF-8");// Post是通过流来获取信息的,因此可以直接通过修改字符集,
											//来解决乱码问题。
  • Get乱码问题
    • 问题分析
      编码的时候是通过utf-8来进行编码,解码的时候却是通过ISO-8859-1进行解码
      而tomcat解码的字符集是固定为ISO-8859-1,因此需要把 ISO-8859-1解码的信息原路返回为字节信息,再 通过utf_8进行解码。在这里插入图片描述
    • URL编码
      1.将字符串按照编码方式转为二进制
      2.每个字节转为2个16进制数并在前边加上%
      在这里插入图片描述
    • 代码演示
String username="XX是你爸";

        //编码 URLEncoder.encode
        String encode = URLEncoder.encode(username, StandardCharsets.UTF_8);
        System.out.println(encode);

        //解码 URLDecoder.decode
        //ISO-8859-1字符集
        String decode1 = URLDecoder.decode(encode, StandardCharsets.ISO_8859_1);
        System.out.println("ISO-8859-1:"+decode1);


        //解决乱码问题; 乱码原因:tomcat进行URL解码,默认的字符集IS0-8859-1
        String s = new String(decode1.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
        System.out.println("解决之后:"+s);

Response

  • 继承结构
    在这里插入图片描述

  • Response 设置响应数据功能介绍

  • Response 完成重定向
    重定向(Redirect):一种资源跳转方式
    在这里插入图片描述
    重定向特点:
    浏览器地址栏路径发生变化
    可以重定向到任意位置的资源(服务器内部、外部均可)
    两次请求,不能在多个资源使用request共享数据

什么路径下需要加虚拟路径—>明确路径谁使用
浏览器使用:需要加虚拟目录(项目访问路径)
服务端使用:不需要加虚拟目录

  • Response 响应字符数据
    PrintWriter writer = resp.getWriter();

    //设置响应头
            resp.setContentType("text/html; charset=utf-8");//charset=utf-8 设置的是数据流出output的编码方式。
    
            //获取字符流输出
            PrintWriter writer = resp.getWriter();
    
            writer.write("你好!");
            writer.write("<h1>你好!</h1>");
            //随着响应结束,response对象销毁,由服务器关闭 so 该流不需要关闭
    
  • Response 响应字节数据
    ServletOutputStream outputStream = resp.getOutputStream();

    //
            FileInputStream fileInputStream = new FileInputStream("///");
            BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
    
            //
            ServletOutputStream outputStream = resp.getOutputStream();
    
            //
            byte[] bytes=new byte[1024];
            int line;
            while ((line=bufferedInputStream.read(bytes))!=-1)
            {
                outputStream.write(bytes,0,line);
            }
    
    //        IOUtils.copy(bufferedInputStream,outputStream); 使用导入的依赖项,可以简化复制流程。
    
            bufferedInputStream.close();
            fileInputStream.close();
    

    在pom文件中导入IO流相关工具类

    <!--导入IO流相关工具类-->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.7</version>
            </dependency>
    

2-3 Mybatis中SqlSessionFactory代码优化

  • 问题分析: Java程序每一个servlet实例与数据库连接都需要引用一次mybatis核心配置文件,来获取连接数据库的对象SqlSession,这样太耗费资源了,性能很低,因此需要把以下共享的代码块调出来。

    String resource ="mybatis-config.xml";
    InputStream inputStream=Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlsessionFactory = new SqlsessionFactoryBuilder().build(inputstream),
    
  • 问题:
    1.代码重复 :工具类
    2.SqlSessionFactory 工厂只创建一次,不要重复创建:静态代码块

  • 解决问题:创建工具类,设置该代码块为静态代码块static

    public class SqlSessionFactoryUtils
    {
        private static final SqlSessionFactory sqlSessionFactory;
        static
        {
            //静态代码块会随着类的加载而自动执行,且只执行一次
            String resource = "mybatis-config.xml";
            InputStream inputStream = null;
            try
            {
                inputStream = Resources.getResourceAsStream(resource);
            } catch (IOException e)
            {
                throw new RuntimeException(e);
            }
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }
    
        public static SqlSessionFactory getSqlSessionFactory()
        {
            return sqlSessionFactory;
        }
    }
    

三、JSP

3-1.概念

  • Java Server Pages,Java服务端页面
  • 一种动态的网页技术,其中既可以定义 HTML、JS、CSS等静态内容,还可以定义Java代码的动态内容
  • JSP = HTML + Java
  • JSP的作用:简化开发,避免了在Servet中直接输出HTML标签

3-2.JSP 快速入门

  1. 导入JSP坐标
  2. 创建JSP文件
  3. 编写 HTML标签 和 Java代码

3-3.JSP 原理

  • JSP 本质上就是一个 Servlet
  • JSP 在被访问时,由JSP容器(Tomcat)将其转换为Java文件(Servlet),在由JSP容器(Tomcat)将其编译,最终对外提供服务的其实就是这个字节码文件
    在这里插入图片描述

3-4.JSP 脚本

  • JSP脚本用于在 JSP页面内定义Java代码
  • JSP 脚本分类:
    <%…%>:内容会直接放到 jspService()方法之中
    <%=…%>:内容会放到out.print()中,作为out.print0)的参数
    <%!..%>:内容会放到 jspService()方法之外,被类直接包含

3-5.JSP缺点

+由于 JSP页面内,既可以定义 HTML标签,又可以定义Java代码,造成了以下问题
1.书写麻烦:特别是复杂的页面
2.阅读麻烦
3.复杂度高:运行需要依赖于各种环境,JRE,JSP容器,JavaEE.
4.占内存和磁盘:JSP会自动生成.java和.class文件占磁盘,运行的是.class文件占内存
5.调试困难:出错后,需要找到自动生成的.java文件进行调试
6.不利于团队协作:前端人员不会 Java,后端人员不精 HTML
在这里插入图片描述

3-6.EL 表达式

  • Expression Language 表达式语言,用于简化JSP页面内的Java代码
  • 主要功能:获取数据
  • 语法:${expression}
    获取域中存储的key为expression的数据
  • JavaWeb中的四大域对象
    1.page:当前页面有效
    2.request:当前请求有效
    3.session:当前会话有效
    4.application:当前应用有效
    EL表达式获取数据,会依次从这4个域中寻找,直到找到为止

3-7.JSTL 标签

  • 概念:JSP标准标签库(Jsp Standarded Tag Library),使用标签取代JSP页面上的Java代码
  • 作用:结合El表达式,更好的在 HTML页面中使用Java语言
  • 快速入门
    1.导入坐标
    <!--JSTL -->
            <dependency>
                <groupId>jstl</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
            <dependency>
                <groupId>taglibs</groupId>
                <artifactId>standard</artifactId>
                <version>1.1.2</version>
            </dependency>
    
    2.在jsp页面引入JSTL标签库
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    3.示范

3-8.MVC 模式和三层架构

  • MVC 是一种分层开发的模式,其中
    M:Model,业务模型,处理业务
    V:View,视图,界面展示
    C:Controller,控制器,处理请求,调用型和视图
  • MVC 好处
    职责单一,互不影响
    有利于分工协作
    有利于组件重用
    在这里插入图片描述
  • 三层架构
    1.数据访问层:对数据库的CRUD基本操作
    2.业务逻辑层:对业务逻辑进行封装,组合数据访问层中基本功能,形成复杂的业务逻辑功能
    3.表现层:接收请求,封装数据,调用业务逻辑层,响应数据
    在这里插入图片描述
  • MVC 模式和三层架构
    在这里插入图片描述

3-9.案例

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值