javaweb基础知识复习版(长篇)

注:来自视频学习笔记,未经允许,不可转载!

欢迎点评.........

欢迎点评.........

欢迎点评.........

一、javaweb基础知识结构图

二、javaweb基础知识详细笔记

    1.javaweb工程学习准备

            1.1.前端基础知识准备:HTML、HTML5、CSS、JS等

            1.2.学习工具安装:JDK-8u271,详细过程参见博客:https://blog.csdn.net/preston555/article/details/109662074

                     环境变量配置:我的电脑 --> 右键 --> 属性 --> 高级系统设置 --> 环境变量设置

                    (1)创建JAVA_HOME:安装目录,如 D:\java\jdk-8u271

                    (2)创建path: %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

                    (3)创建classpath:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

            1.3.学习工具安装:intellij idea2018,详细过程可百度或在本站搜索

            1.4.学习工具安装:Tomcat8:https://blog.csdn.net/preston555/article/details/110188286

            1.5.第一个多model的Project创建过程(文字版描述版,以第一次安装使用为例)

                     create new project --> 进入new Project设置界面 :选择java (1.project sdk选择jdk安装路径;2.additional libraries and frameworks选择web application(4.0);其它默认),next --> project name设置工程名称;project location设置工程保存位置 ;

                     more settings部分设置model(如果model名字和project name完全一样,就是单model;不一样就是多model模式。),然后finish--> 进入编辑界面--->配置Tomcat(详情参见1.3处链接)

    2.http基础知识

            2.1.javaweb主流服务器:WebLogic、Tomcat、JBoss

            2.2.http相关概念结构图

    3.javaweb三大组件之servlet基础知识

            3.1.创建servlet的两种操作方法(如创建HelloServlet):选择指定包右键-->new-->(方式1选择java,方式2选择servlet)

                    (1)(servlet3.0之前)new一个java文件:HelloServlet-->然后继承extends HttpServlet-->Override(复写)其 doGet()和doPost()方法-->配置web.xml文件(在<web-app>这里配置servlet</web-app>)-->部署配置Tomcat-->启动服务器(浏览器显示)

                    (2)(servlet3.0开始)new一个servlet文件,名称为HelloServlet-->注解里面添加(,URLPattern=”/hello")-->部署配置Tomcat-->启动服务器(浏览器显示)

                    (3)详细示例,请访问本站博文:https://blog.csdn.net/preston555/article/details/110000469                           

            3.2.servlet的简单应用

                    (1)通过HttpServletRequest请求对象获取请求信息

package com.study.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Map;

@WebServlet(name = "RequestServlet",urlPatterns = "/request")
public class RequestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("接收到get请求");
        //请求行
        System.out.println("请求方式:"+request.getMethod());
        System.out.println("URI:"+request.getRequestURI());
        System.out.println("发出请求客户端IP地址:"+request.getRemoteAddr());
        System.out.println("服务点请求的IP地址:"+request.getLocalAddr());
        System.out.println("访问客户端的端口号"+request.getRemotePort());
        System.out.println("web应用路径:"+request.getContextPath());
        System.out.println("http协议和版本:"+request.getProtocol());

        //获取请求头1:获取一个指定头字段的值,不存在返回-1,存在多个取第一个
        String port = request.getHeader("port");

        //获取请求头2:获取指定头字段的值,并且按照GMT时间格式转换成一个代表日期/时间的长整数
        int port1 = request.getIntHeader("port");

        //获取请求头3:获取指定头字段的值,并且将其值转为int型,不存在返回-1,不能转回发生NumberFormatException
        long port2 = request.getDateHeader("port");

        //获取请求头4:获取所有包含请求头字段的Enumeration
        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()){
            String element = headerNames.nextElement();
            System.out.println(element+":"+request.getHeader(element));
        }

        //请求参数1:获取请求中指定名称的参数值
        String name = request.getParameter("name");
        String passWord = request.getParameter("passWord");
        System.out.println("用户名:"+name);
        System.out.println("密码:"+passWord);

        //请求参数2:获取请求中所有参数的名称以及值装入一个map对象中
        Map<String, String[]> parameterMap = request.getParameterMap();

        //请求参数3:获取请求中所有参数的名称
        Enumeration<String> parameterNames = request.getParameterNames();
        while(parameterNames.hasMoreElements()){
            String s = parameterNames.nextElement();
            System.out.println(s);
        }

    }
}

                    (2)通过HttpServletResponse响应对象发送响应信息

package com.study.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Map;

@WebServlet(name = "RequestServlet",urlPatterns = "/response")
public class RequestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //发送响应行
        response.setStatus(201);//发送状态码(200是默认),成功发送用该方法
        response.sendError(404,"找不到页面资源!");//发送错误状态码

        //发送响应头
        response.addHeader("name","preston");//name是头字段,“preston”是值
        response.setHeader("name","preston");//与上相同,此外这个可以重复添加相同字段,若相同字段后添加覆盖之前添加
        response.addIntHeader("score",100);//作为整数添加
        response.setContentLength(100);//设置http响应消息的内容大小,单位是字节
        response.setContentType("text/html;charset=utf-8");//设置servlet输出内容的类型
        response.setCharacterEncoding("utf-8");//设置响应编码格式


        //检验登陆状态方式1
        String result="登陆成功!";
        //发送响应体1:
//        ServletOutputStream outputStream = response.getOutputStream();
//        outputStream.write(result.getBytes());
        //检验登陆状态方式2
        response.setContentType("text/html;charset=utf-8");//没有设置这个编码格式,有可能输出结果是乱码
        //发送响应体2:
        PrintWriter writer = response.getWriter();
        writer.write(result);
        


    }
}

                    (3)图片验证码创建

package com.study.servlet;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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;

@WebServlet(name = "VerifyCodeServlet",urlPatterns = "/code")
public class VerifyCodeServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置图片的宽和高
        int width=100;
        int height=30;

        //定义随机字符
        String data="abcdefghijklmnopqrstuvwxyz0123456789";
        //创建随机对象
        Random random = new Random();
        //创建图片流
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);

        //设置图片背景色及形状
        Graphics graphics = image.getGraphics();
        graphics.setColor(Color.gray);
        graphics.fillRect(0,0,width,height);

        //设置随机字符数量和颜色、位置及字符
        graphics.setColor(Color.black);
        String codeString="";
        for(int i=0;i<4;i++){
            int position=random.nextInt(data.length());
            String substring = data.substring(position, position + 1);
            codeString +=substring;//拼接单个验证码字符成验证码字符串
            graphics.drawString(substring,width/5*(i+1),15);
        }
        //将验证码字符串设置到请求servletContext作用域中,方便登陆时验证码的验证
        this.getServletContext().setAttribute("codeString",codeString);
        //输出响应信息到图片中
        ImageIO.write(image,"jpg",response.getOutputStream());
    }
}



//前端代码

<%--
  Created by IntelliJ IDEA.
  User: shinelon
  Date: 2020/11/23
  Time: 10:41
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>验证码</title>
</head>
<body>
<center>
    <h2>切换验证码</h2>
    <script>
        function changeImageCode() {
            document.getElementById('btn').isDisable=true;
            document.getElementById('identity').src='code?ts='+new Date().getTime();
        }
    </script>

    <img src="code" id="identity" onload="btn.disable=false;" style="cursor: pointer;vertical-align: center" />

    <input type="button" value="看不清,更换验证码" onclick="changeImageCode()" id="btn" style="vertical-align: center" />
</center>
</body>
</html>

                    (4)servlet的生命周期:(servlet是单例)

                                     aa.第一次访问浏览器,先执行init()方法,然后执行service()方法

                                     bb.第二次访问浏览器,如果没有servlet对象存在,先执行init()方法,然后执行service()方法;如果已经存在,则直接执行service()方法

                                     cc.关闭服务器,执行destroy()方法

                    (5)ServletConfig对象:是它所对应的servlet对象的相关配置信息。

                                      特点是:唯一对应,不能与其它servlet共享

                                      常用方法如下:

        /**
         * config对象获取servlet对象的相关配置信息
         */
        ServletConfig servletConfig = this.getServletConfig();
        String encoding = servletConfig.getInitParameter("encoding");//获取初始化的编码格式信息
        Enumeration<String> names = servletConfig.getInitParameterNames();//获取初识化参数的所有名称
        while (names.hasMoreElements()){
            String element = names.nextElement();
            System.out.println(element);
        }
        System.out.println("encoding = "+encoding);

                    (6)ServletContext对象:是servlet上下文对象,该对象表示当前的web应用环境信息。servletContext对象是域对象,通常称为Context域对象

                                      获取servletContext对象的两种方式:

        //方式1:
        ServletContext servletContext1 = this.getServletConfig().getServletContext();
        //方式2:
        ServletContext servletContext = this.getServletContext();

                                      应用如下:

        //根据名称获取初识化参数
        String encoding1 = this.getServletContext().getInitParameter("encoding");
        //获取所有初始化参数名称
        Enumeration<String> initParameterNames = this.getServletContext().getInitParameterNames();

        //使用servletContext在多个servlet中实现数据共享
        this.getServletContext().setAttribute("name","preston");//存放数据
        Object name = this.getServletContext().getAttribute("name");//获取数据
        this.getServletContext().removeAttribute("name");//删除数据

        //使用servletContext读取项目配置文件信息,例如读取db.properties文件
        InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/db.properties");
        Properties properties = new Properties();
        properties.load(resourceAsStream);
        String name = properties.getProperty("name");
        String passWord = properties.getProperty("passWord");
        String url = properties.getProperty("url");


//db.properties
name=preston
passWord=50095
url=baidu.com

                    (7)servlet之间的跳转:转发(forward)和重定向(redirect)

                                     aa.请求转发:在servlet中如果当前的web资源不想处理请求时,可以通过forward方法将当前的请求传递给其它的web资源处理,这种方式就称为请求转发。

                                     bb.重定向:重定向是根据服务器返回的状态码来实现的。状态码的获取通过服务器httpservletresponse的setstatus()方法设置,然后浏览器根据新的请求网址去访问新网址

请求重定向相关代码:
方法1:
//设置状态码为302,即SC_MOVED_TEMPORAILY
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORAILY);
//在请求头中携带新地址
response.setHeader("Location","http://www.baidu.com"

方法2:
可以写成如下一条语句:
response.sendRedirect(String location);


请求转发相关代码:
request.getRequestDispatcher(String location).forward(request,response)

                                     cc.两者区别

                    (8)自动刷新的方式:

        //自动刷新1:3秒后自动刷新
        response.setContentType("text/html;charset=utf-8");
        response.setHeader("refresh","3");
        response.getWriter().print("3秒后自动刷新");

        //自动刷新1:3秒后跳转到指定网页
        response.setHeader("refresh","3;url='/hello/index.jsp'");
        response.getWriter().print("3秒后自动刷新");

        //自动刷新3:3秒后自动跳转到指定网页,也可以点击“跳转链接”跳转到指定页
        String message="<meta http-equiv='refresh' content='3;url=/hello/index.jsp'>3秒后会自动跳转到首页,如果没有跳转,请点击<a href='/hello/index.jsp'>跳转连接</a>";
        request.setAttribute("message",message);
        request.getRequestDispatcher("/index.jsp").forward(request,response);

                    (9)servlet的线程安全问题:当多个客户端访问同一servlet的同一方法中的共享资源时,web服务器为每一个客户端创建了一个线程,可能引发线程安全问题。解决方式:

                                     aa.同步代码块(即synchronize(this){Thread.sleep(1000);其它代码}(这个方法缺点是:当多个用户同时访问时,有可能用户等待时间过长)

                                     bb.实现SingleThreadModle接口(这个方法已经不推荐使用)

                                     cc.尽量不在servlet实例中使用共享变量(这个相对较好)

                    (10)实现资源的下载,前提是已经上传资源到服务器中

//前端代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件下载页面</title>
</head>
<body>
<center>

    <h2>文件下载列表</h2>

    <form action="download" method="get">
        <p><input type="text" value="大熊猫图片" disabled="false"/>
            <input type="text" value="xm.jpg" name="点击下载1" hidden="true"/>
            <input type="submit" value="点击下载1" name="down"/>
        </p>
        <p><input type="text" value="Tomcat8.5.60压缩文件" disabled="false"/>
            <input type="text" value="apache-tomcat-8.5.60-windows-x64.zip" name="点击下载2" hidden="true"/>
            <input type="submit" value="点击下载2" name="down"/>
        </p>
        <p><input type="text" value="UML类图" disabled="false"/>
            <input type="text" value="UML类图.xlsx" name="点击下载3" hidden="true"/>
            <input type="submit" value="点击下载3" name="down"/>
        </p>
    </form>
</center>
</body>
</html>


//后端执行代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //获取对应点击下载按钮的属性值(比如点击“点击下载1”,得到“点击下载”)
        String down = request.getParameter("down");

        //获取下载的文件名(通过“点击下载1”得到文件名“xm.jpg”)
        String filename = request.getParameter(down);
        //通知浏览器不要预览,直接下载(这里得到执行方式)
        String type = this.getServletContext().getMimeType(filename);
        response.setContentType(type);
        //通知浏览器下载的文件名
        response.setHeader("Content-Disposition","attachment;filename="+filename);

        //获取文件的绝对路径(通过文件名去找文件在服务器上的具体位置,然后开始下载)
        String realPath = this.getServletContext().getRealPath("download/"+filename);
        InputStream in = new FileInputStream(realPath);
        ServletOutputStream outputStream = response.getOutputStream();//输出二进制文件

        //文件拷贝
        int len=0;
        byte[] buffer=new byte[1024];
        while ((len=in.read(buffer))>0){//当小于等于0表示文件已经复制完
            outputStream.write(buffer,0,len);
        }
        in.close();
    }

                    (11)综合实例详见:https://blog.csdn.net/preston555/article/details/110004445

            3.3.Cookie和Session

                    (1)两者的相同与不同点

                    (2)两者的简单应用实例

/**
 * cookie简单应用实例:记录网站访问时间
 */
package com.study.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

@WebServlet(name = "TimeServlet",urlPatterns = "/time")
public class TimeServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Date date=new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd-hh:mm:ss");
        String format = simpleDateFormat.format(date);

        Cookie cookie = new Cookie("time", format);
        cookie.setMaxAge(60*20);
        response.addCookie(cookie);

        Cookie[] cookies=request.getCookies();
        response.setContentType("text/html;charset=utf-8");
        String timeValue=null;
        for (Cookie cookie1 : cookies) {
            if(cookie1.getName().equals("time")){
                timeValue=cookie1.getValue();
            }
        }

        if(timeValue==null){
            response.getWriter().write("欢迎访问我们的网站");
        }else{
            response.getWriter().write("您上次访问的时间是:"+timeValue);
        }
    }
}

/**
 * session简单应用实例:获取页面的商品信息
 */
//前端代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>商品列表</title>
</head>
<body>
<h1>商品列表</h1>
<a href="/session/addCart?name=杯子">杯子</a><br>
<a href="/session/addCart?name=书包">书包</a><br>
<a href="/session/addCart?name=电脑">电脑</a><br>
</body>
</html>


package com.study.session;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 添加商品到session域中
 */
@WebServlet(name = "AddCartServlet",urlPatterns = "/addCart")
public class AddCartServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取到商品信息
        String name = request.getParameter("name");
        //需要保存商品信息到session中
        HttpSession session = request.getSession();
        //先获取session中list的集合信息
        List list = (List) session.getAttribute("list");

        //第一次访问时list不存在,需要创建一个list
        if(list==null){
            list=new ArrayList();
        }
        list.add(name);
        //将list集合信息设置到session域中
        session.setAttribute("list",list);
        //设置session的持久化时间
        Cookie cookie = new Cookie("JSESSIONID", session.getId());
        cookie.setMaxAge(60*20);
        //表示只在session项目下挈带cookie保存的session的ID信息
        cookie.setPath("/session");
        response.addCookie(cookie);
    }
}


package com.study.session;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;

/**
 * 从session域中获得商品信息并读取显示
 */
@WebServlet(name = "GetCartServlet",urlPatterns = "/getCart")
public class GetCartServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        //获取session的集合信息
        List<String> list = (List<String>) session.getAttribute("list");
        response.setContentType("text/html;charset=utf-8");
        //遍历读取集合的信息
        for (String s : list) {
            response.getWriter().write(s+"<br/>");
        }
    }
}

    4.jsp基础知识

            4.1 jsp的运行原理(如hello.jsp):

                     第一次访问hello.jsp--->helloServlet.jsp--->helloServlet_jsp.java--->编译运行。(因此,本质上就是一个servlet,它经过转化后也有servlet的三个方法:init()、service()、destroy()。

            4.2 jsp脚本和注释

                    4.2.1 jsp脚本

                    (1)<% java代码 %> -------------------内部的java代码翻译到service方法的内部(用于编写具体业务逻辑,也可以定义局部变量或调用方法,但不能定义方法)

                    (2)<%= java变量或表达式 %> -----会被翻译成service方法内部out.print()(将已经声明的变量或者表达式输出到浏览器页面上)

                    (3)<%!  java代码 %> -----------------会被翻译成servlet的成员内容(用于声明全局变量或方法,可能有线程安全问题,如变量等,一般不使用)

                    4.2.2 jsp注释

                    (1)<!--注释内容 --> -------------------可见范围:jsp源码、翻译后的servlet、页面显示HTML源码

                    (2)//注释内容 ----------------------------可见范围:jsp源码、翻译后的servlet

                    (3)<%--  注释内容 --%> --------------可见范围:jsp源码

            4.3 jsp的三大指令

                    4.3.1 page指令:页面特征设置。格式:<%@ page 属性1=“值1” 属性2=“值2” ... %>;常用属性如下:

                    (1)language:脚本嵌入语言种类,如 language="java"

                    (2)contentType:设置输出形式,如 contentType=‘text/html;charset=utf-8"

                    (3)session:是否jsp在编译时自动创建session,如 session=false 表示不可以;session=true 表示可以;默认是true

                    (4)import:导入java包,如 import="com.study.entity.User"

                    (5)errorPage:当前页面出错跳转到哪个页面,如 isErrorPage="true"(表示这个页面是错误页面,反之为普通页面)

                    4.3.2 include指令:页面包含(静态包含)指令,即包含另一个jsp页面。格式:<%@ include file="被包含界面的地址" %>

                    4.3.3 taglib指令:在页面中引入标签库(如jstl标签库、struts2标签库)。格式:<%@ taglib prefix="前缀" uri="标签库地址"  %>

<%--
  Created by IntelliJ IDEA.
  User: shinelon
  Date: 2020/12/1
  Time: 18:30
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>JSP脚本及注释和指令的简单演示页面</title>
</head>
<body>
<%
    //声明变量name并初始化(这是java注释)
    String name="preston";
    request.setAttribute("name",name);
    response.setContentType("text/html;charset=utf-8");
%>
<%--输出内容(这是jsp注释)--%>
<%= "name = "+name %>
<!--定义一个成员变量(这是HTML注释)-->
<%! int num=10;%>

</body>
</html>


结果:name = preston

 

            4.4 jsp的九大隐式对象:当jsp被翻译成servlet的时候,service方法内部有九个对象定义并初始化

                    4.4.1 九大隐式对象内容

                    4.4.2 九大隐式应用实例(简单)

<%--
  Created by IntelliJ IDEA.
  User: shinelon
  Date: 2020/12/1
  Time: 20:37
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>九大隐式对象举例</title>
</head>
<body>
<%--在<% %>里面使用,可直接获取对象使用--%>
<%--out隐式对象应用实例:输出内容--%>
<%
    out.write("这是out的隐式对象输出内容");
%>
<%--request和response隐式对象应用实例--%>
<%
    request.setAttribute("name","preston");
    response.setHeader("title","learning jsp");
%>

<%--session和config隐式对象应用实例--%>
<%
    session.setAttribute("password","123456");
    String encoding = config.getInitParameter("encoding");
%>
<%--application和pageContext隐式对象应用实例--%>
<%
    application.setAttribute("content","welcome to jsp");
    //页面显示内容转到first.jsp
    //pageContext.forward("/first.jsp");
%>
<%--jsp使用exception对象的前提:必须设置<%@ page isErrorPage="true" %>--%>
<%--显示上面设置的内容--%>
<%=request.getAttribute("name")%>
<%=response.getHeader("title")%>
<%=session.getAttribute("password")%>
<%=encoding%>
<%=application.getAttribute("content")%>

</body>
</html>

                    4.4.3 常用方法图

                                              (参考博客:https://blog.csdn.net/erlian1992/article/details/51863640  参考的博客中援引的原文地址:http://blog.csdn.net/csuliky/article/details/2439424

           4.5 jsp的四大作用域

                    4.5.1 四大作用域内容

            4.6 jsp的常用标签:jsp标签用来控制jsp的行为,执行一些常用的jsp页面动作,如:

                          (1)  <jsp:forward page="要转发的资源" />

                          (2) <jsp:include page="包含的资源文件" />(动态包含页面)

           4.7 EL表达式:全称Expression Language,提供了在jsp中简化表达式的方法,让jsp代码更加简化,可以嵌入在jsp页面内部,减少jsp脚本的编写

                    4.7.1 EL的使用示例

             

//在bean包下创建一个User类

<%@ page import="com.study.bean.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %><%--
  Created by IntelliJ IDEA.
  User: shinelon
  Date: 2020/12/1
  Time: 22:25
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>EL表达式</title>
</head>
<body>
<%
    request.setAttribute("name","小明");
    request.setAttribute("age",20);

    User user=new User();
    user.setName("preston");
    user.setAge(10);
    session.setAttribute("user",user);//隐式对象可以直接使用

    User user1=new User();
    user1.setName("preston1");
    user1.setAge(12);
    User user2=new User();
    user2.setName("preston2");
    user2.setAge(15);

    List<User> list=new ArrayList<>();
    list.add(user1);
    list.add(user2);
    application.setAttribute("list",list);//设置到context作用域中

%>

<%=request.getAttribute("name")%>
<%
    User user3= (User) session.getAttribute("user");//因为其返回的结果是Object,所以需要强转
    String name = user3.getName();
    out.write(name);
%>

<%
    List<User> list1 = (List<User>) application.getAttribute("list");
    User user4 = list1.get(0);
    out.write(user4.getName());

%>

<%--EL表达式简单如下:--%>
${requestScope.name}
${sessionScope.user.name}
${applicationScope.list[0].name}

<%--EL表达式更简单如下:--%>
${name}
${user.name}
${list[0].name}

</body>
</html>

                   4.7.2 EL的内置对象

                    4.7.3 EL的执行表达式,如:${1+1}    ${2 eq 3}(判断相等)   ${3 > 2 ? true : false}(可以使用三元运算符)   ${empty user}(判断对象是否为空}

                    4.7.4  jstl标签的学习(jsp standard tag library),jstl有五大标签库,核心学习(常用)就是一个(红色部分):

                      4.7.5  jstl标签之core标签库的简单学习示例汇总(附jsp学习网:https://www.runoob.com/jsp/jstl-core-choose-tag.html:                  

                    4.7.6  jstl标签的简单示例(书籍的简单列表展现):

//前端代码

<%--
  Created by IntelliJ IDEA.
  User: shinelon
  Date: 2020/12/1
  Time: 23:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>书籍的简单列表</title>
</head>
<body>

<c:forEach items="${list}" var="book">
    <div>
        <img src="${book.image}" width="170" height="170" />
        <p>书名:${book.name}</p>
        <p>作者:${book.author}</p>
        <p>价格:${book.price}</p>
    </div>
</c:forEach>

</body>
</html>


//Book实体类

package com.study.bean;

public class Book {
    private String name;
    private String author;
    private String image;
    private int price;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }
}


//servlet
package com.study.servlet;

import com.study.bean.Book;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@WebServlet(name = "BookServlet",urlPatterns = "/book")
public class BookServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Book book1=new Book();
        book1.setImage("https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E5%9B%BE%E4%B9%A6&step_word=&hs=0&pn=1&spn=0&di=43670&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=0&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=undefined&cs=3276848340%2C2569914737&os=438924600%2C2804659761&simid=4065457509%2C546476633&adpicid=0&lpn=0&ln=1053&fr=&fmq=1606839039943_R&fm=&ic=undefined&s=undefined&hd=undefined&latest=undefined&copyright=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=http%3A%2F%2Fn.sinaimg.cn%2Ftranslate%2Fw600h407%2F20180104%2FZIPq-fyqincu1601826.jpg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fgjof_z%26e3Bftgw_z%26e3Bv54_z%26e3BvgAzdH3F5AzdH3Fda8b-a8-a9AzdH3F15v-tuyqto7omn888l9_z%26e3Bfip4s&gsm=2&rpstart=0&rpnum=0&islist=&querylist=&force=undefined");
        book1.setName("book1");
        book1.setAuthor("preston1");
        book1.setPrice(100);

        Book book2=new Book();
        book2.setImage("https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E5%9B%BE%E4%B9%A6&step_word=&hs=0&pn=1&spn=0&di=43670&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=0&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=undefined&cs=3276848340%2C2569914737&os=438924600%2C2804659761&simid=4065457509%2C546476633&adpicid=0&lpn=0&ln=1053&fr=&fmq=1606839039943_R&fm=&ic=undefined&s=undefined&hd=undefined&latest=undefined&copyright=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=http%3A%2F%2Fn.sinaimg.cn%2Ftranslate%2Fw600h407%2F20180104%2FZIPq-fyqincu1601826.jpg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fgjof_z%26e3Bftgw_z%26e3Bv54_z%26e3BvgAzdH3F5AzdH3Fda8b-a8-a9AzdH3F15v-tuyqto7omn888l9_z%26e3Bfip4s&gsm=2&rpstart=0&rpnum=0&islist=&querylist=&force=undefined");
        book2.setName("book2");
        book2.setAuthor("preston2");
        book2.setPrice(80);

        Book book3=new Book();
        book3.setImage("https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E5%9B%BE%E4%B9%A6&step_word=&hs=0&pn=1&spn=0&di=43670&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=0&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=undefined&cs=3276848340%2C2569914737&os=438924600%2C2804659761&simid=4065457509%2C546476633&adpicid=0&lpn=0&ln=1053&fr=&fmq=1606839039943_R&fm=&ic=undefined&s=undefined&hd=undefined&latest=undefined&copyright=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=http%3A%2F%2Fn.sinaimg.cn%2Ftranslate%2Fw600h407%2F20180104%2FZIPq-fyqincu1601826.jpg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fgjof_z%26e3Bftgw_z%26e3Bv54_z%26e3BvgAzdH3F5AzdH3Fda8b-a8-a9AzdH3F15v-tuyqto7omn888l9_z%26e3Bfip4s&gsm=2&rpstart=0&rpnum=0&islist=&querylist=&force=undefined");
        book3.setName("book3");
        book3.setAuthor("preston3");
        book3.setPrice(200);

        Book book4=new Book();
        book4.setImage("https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E5%9B%BE%E4%B9%A6&step_word=&hs=0&pn=1&spn=0&di=43670&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=0&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=undefined&cs=3276848340%2C2569914737&os=438924600%2C2804659761&simid=4065457509%2C546476633&adpicid=0&lpn=0&ln=1053&fr=&fmq=1606839039943_R&fm=&ic=undefined&s=undefined&hd=undefined&latest=undefined&copyright=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=http%3A%2F%2Fn.sinaimg.cn%2Ftranslate%2Fw600h407%2F20180104%2FZIPq-fyqincu1601826.jpg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fgjof_z%26e3Bftgw_z%26e3Bv54_z%26e3BvgAzdH3F5AzdH3Fda8b-a8-a9AzdH3F15v-tuyqto7omn888l9_z%26e3Bfip4s&gsm=2&rpstart=0&rpnum=0&islist=&querylist=&force=undefined");
        book4.setName("book4");
        book4.setAuthor("preston4");
        book4.setPrice(70);


        Book book5=new Book();
        book5.setImage("https://image.baidu.com/search/detail?ct=503316480&z=undefined&tn=baiduimagedetail&ipn=d&word=%E5%9B%BE%E4%B9%A6&step_word=&ie=utf-8&in=&cl=2&lm=-1&st=undefined&hd=undefined&latest=undefined&copyright=undefined&cs=1411914927,273448151&os=2753521682,576092591&simid=3194411629,3666731164&pn=4&rn=1&di=86130&ln=1053&fr=&fmq=1606839039943_R&fm=&ic=undefined&s=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&is=0,0&istype=0&ist=&jit=&bdtype=0&spn=0&pi=0&gsm=0&objurl=http%3A%2F%2Fimg2.tbcdn.cn%2Ftfscom%2Fi1%2F825133894%2FTB2nnQAkXXXXXauXXXXXXXXXXXX_%2521%2521825133894.jpg&rpstart=0&rpnum=0&adpicid=0&force=undefined");
        book5.setName("book5");
        book5.setAuthor("preston5");
        book5.setPrice(90);

        List<Book> list=new ArrayList<>();
        list.add(book1);
        list.add(book2);
        list.add(book3);
        list.add(book4);
        list.add(book5);

        request.setAttribute("list",list);
        request.getRequestDispatcher("/books.jsp").forward(request,response);

    }
}

    5.数据库基础知识:https://blog.csdn.net/preston555/article/details/110588959

    6.监听器基础知识

            6.1.基础知识表

            6.2.简单实例应用(定时促销)

web-info目录下的lib包:c3p0-0.9.5.2.jar;commons-dbutils-1.6.jar;
              
mysql-connector-java-8.0.14.jar;mchange-commons-java-0.2.11.jar总共4个

src目录下的配置文件:c3p0-config.xml


//product类
package com.study.bean;

import java.math.BigDecimal;

public class Product {
    private int p_id;
    private String p_name;
    private BigDecimal p_price;
    private String p_image;
    private int c_id;

    public Product() {
    }

    @Override
    public String toString() {
        return "Product{" +
                "p_id=" + p_id +
                ", p_name='" + p_name + '\'' +
                ", p_price=" + p_price +
                ", p_image='" + p_image + '\'' +
                ", c_id=" + c_id +
                '}';
    }

    public int getP_id() {
        return p_id;
    }

    public void setP_id(int p_id) {
        this.p_id = p_id;
    }

    public String getP_name() {
        return p_name;
    }

    public void setP_name(String p_name) {
        this.p_name = p_name;
    }

    public BigDecimal getP_price() {
        return p_price;
    }

    public void setP_price(BigDecimal p_price) {
        this.p_price = p_price;
    }

    public String getP_image() {
        return p_image;
    }

    public void setP_image(String p_image) {
        this.p_image = p_image;
    }

    public int getC_id() {
        return c_id;
    }

    public void setC_id(int c_id) {
        this.c_id = c_id;
    }
}


//监听器
package com.study.promotion;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.study.bean.Product;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

@WebListener()
public class PromotionListener implements ServletContextListener{


    public PromotionListener() {
    }


    public void contextInitialized(ServletContextEvent sce) {
        //创建一个定时器
        Timer timer=new Timer();

        //调用方法:20秒执行一次
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                try {
                    ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
                    QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
                    String sql="select * from product";
                    List<Product> productList = queryRunner.query(sql, new BeanListHandler<Product>(Product.class));

                    if(productList !=null && productList.size()>0){
                        for (Product product : productList) {
                            if(product.getC_id()==1){
                                BigDecimal p_price=product.getP_price();

                                BigDecimal temp=new BigDecimal(150);
                                p_price=p_price.subtract(temp);

                                product.setP_price(p_price);
                                System.out.println(product.getP_name()+"现在大促销辣!大家快来看一看,瞧一瞧耶!现在只需"+product.getP_price()+"元!");
                            }else{
                                BigDecimal p_price=product.getP_price();

                                BigDecimal temp=new BigDecimal(100);
                                p_price=p_price.subtract(temp);

                                product.setP_price(p_price);
                                System.out.println(product.getP_name()+"现在大促销辣!大家快来看一看,瞧一瞧耶!现在只需"+product.getP_price()+"元!");
                            }
                        }
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        },new Date(),1000*20);
    }

    public void contextDestroyed(ServletContextEvent sce) {

    }



}


            6.3.结果示例:

    7.过滤器基础知识

            7.1.基础知识表

           7.2.简单实例应用(编码格式设置)

package com.study.servlet;

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

@WebServlet(name = "Servlet3",urlPatterns = "/test3")
public class Servlet3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().write("你好,hello world!");
    }
}


package com.study.filters;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;

/**
 * 对urlpattern是test3的servlet请求进行拦截
 */
@WebFilter(filterName = "CharsetFilter",urlPatterns = "/test3",initParams = {@WebInitParam(name="encoding",value = "text/html;charset=utf-8")})
public class CharsetFilter implements Filter {
    private String encoding;
    //获取初始化参数
    public void init(FilterConfig config) throws ServletException {
        encoding = config.getInitParameter("encoding");

    }
    //进行过滤操作
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //设置请求编码格式
        if(encoding !=null){
            resp.setContentType(encoding);
        }
        chain.doFilter(req, resp);
    }
    //关闭服务器时销毁
    public void destroy() {
        encoding=null;
    }

}

            7.3.结果示例

 

三、javaweb工程怎么创建

链接在这里:https://blog.csdn.net/preston555/article/details/110000469

四、javaweb项目实例:生鲜管理系统简易版详细过程

链接在这里:https://mp.csdn.net/editor/html/110188286

五、javaweb项目实例:人力资源管理系统简易版详细过程

链接在这里:https://mp.csdn.net/editor/html/110478593

猜你喜欢

转载自blog.csdn.net/preston555/article/details/110345340