Spring学习总结

(一)Servlet

1、Servlet简介

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

  • Sun在这些API中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:

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

2、HelloServlet

(1)Maven父子工程

构建一个普通的maven项目,删除掉里面的src目录,以后我们的学习就在这个项目里面创建Moudel,这个空的工程就是Maven的主工程

(2)关于Maven父子工程的理解:

父项目中会有一个moudle:

<modules>
        <module>JavaWeb_01_mavenmodule>
modules>

子项目中会有:

<parent>
        <artifactId>JavaWeb_ParentsartifactId>
        <groupId>org.examplegroupId>
        <version>1.0-SNAPSHOTversion>
 parent>

父项目中所有jar包配置的java子项目可以直接使用:相当于java的继承多态特性

son extends father

(3)Maven环境优化

修改web.xml为最新的

将maven的结构搭建完整

(4)编写一个Servlet

HTTPServlet----GenericServlet----Servlet

void init(ServletConfig var1) throws ServletException; //初始化

ServletConfig getServletConfig();//获取Servlet配置

void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

String getServletInfo();//获取信息

void destroy();//注销
  • 编写一个普通类

  • 实现Servlet几口,这里我们直接继承HttpServlet

package com.LearnMaven.servlet;

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 HelloServlet extends HttpServlet {
    
    //由于ge和post知识请求实现的不同方式,可以相互调用业务逻辑
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();//响应流
        writer.print("Hello.serlver");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

(5)编写Servlet的映射

为什么需要映射?

我们写的Java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务器中注册我们写的Servlet,还需要给它一个访问的路径。


    <servlet>
        <servlet-name>helloServletservlet-name>
        <servlet-class>com.LearnMaven.servlet.HelloServletservlet-class>
    servlet>

    <servlet-mapping>
        <servlet-name>helloServletservlet-name>
        <url-pattern>/hellourl-pattern>
    servlet-mapping>

(6)配置Tomcat

注意:配置项目的发布路径就可以了

(7)启动测试,OK

3、Servlet原理

Servlet是有Web服务器调用,web服务器在收到浏览器

请求之后会:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C2upvFxt-1631325712337)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210708204804381.png)]

4、Mapping问题

1、一个Servlet可以指定一个映射路径


<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>helloServletservlet-name>
        <servlet-class>com.LearnMaven.servlet.HelloServletservlet-class>
    servlet>

    <servlet-mapping>
        <servlet-name>helloServletservlet-name>
        <url-pattern>/hellourl-pattern>
    servlet-mapping>

web-app>

2、一个Servlet可以指定多个映射路径


<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>helloServletservlet-name>
        <servlet-class>com.LearnMaven.servlet.HelloServletservlet-class>
    servlet>

    <servlet-mapping>
        <servlet-name>helloServletservlet-name>
        <url-pattern>/hellourl-pattern>
    servlet-mapping>
    <servlet-mapping>
        <servlet-name>helloServletservlet-name>
        <url-pattern>/hello2url-pattern>
    servlet-mapping>
    <servlet-mapping>
        <servlet-name>helloServletservlet-name>
        <url-pattern>/hello3url-pattern>
    servlet-mapping>
    <servlet-mapping>
        <servlet-name>helloServletservlet-name>
        <url-pattern>/hello4url-pattern>
    servlet-mapping>


web-app>

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

<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>helloServletservlet-name>        <servlet-class>com.LearnMaven.servlet.HelloServletservlet-class>    servlet>    <servlet-mapping>        <servlet-name>helloServletservlet-name>        <url-pattern>/hellourl-pattern>    servlet-mapping>    <servlet-mapping>        <servlet-name>helloServletservlet-name>        <url-pattern>/*url-pattern>    servlet-mapping>web-app>

4、默认请求路径

    <servlet-mapping>        <servlet-name>helloServletservlet-name>        <url-pattern>/*url-pattern>    servlet-mapping>

5、指定一些后缀或者前缀等等……

    <servlet-mapping>        <servlet-name>helloServlet servlet-name>        <url-pattern>*.docurl-pattern>    servlet-mapping>

6、优先级问题

制定了固有的映射路径优先级最高,如果找不到就走默认的请求。

    <servlet-mapping>        <servlet-name>errorServletservlet-name>        <url-pattern>/*url-pattern>    servlet-mapping>

5、ServletContext

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

1、共享数据
  • 我在这个Servlet中保存的数据,可以在另外一个Servlet中得到
package com.LearnMaven.Servlet1;
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;
public class HelloServlet extends HttpServlet {
    @Override    
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //        System.out.println("hello,world!");        
        ServletContext context = this.getServletContext();       
        String username="青江";        
        context.setAttribute("username",username);//将一个数据保存在了ServletContext中,名字为“username" 值为username    
    }   
package com.LearnMaven.Servlet1;
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 = getServletContext();        
                                                                                                              
String username=(String)context.getAttribute("username");  
      
                                                                                                          resp.setContentType("text/html");        
                                                                                                                 resp.setCharacterEncoding("utf-8");      
                                                                                                                 resp.getWriter().write("姓名:"+username);  
     }  
<servlet>       
	<servlet-name>helloServlet1servlet-name>       
	<servlet-class>com.LearnMaven.Servlet1.HelloServletservlet-class>    
servlet>    
<servlet-mapping>        
	<servlet-name>helloServlet1servlet-name>        
	<url-pattern>/hello1url-pattern>    
servlet-mapping>    
<servlet>    
	<servlet-name>getServletservlet-name>        
	<servlet-class>com.LearnMaven.Servlet1.GetServletservlet-class>   
servlet>    
<servlet-mapping>       
	<servlet-name>getServletservlet-name>       
	<url-pattern>/getservleturl-pattern>    
servlet-mapping>
2、获取初始化参数

xml配置

   
<context-param>        
	<param-name>urlparam-name>        
	<param-value>jdbc:mysql://localhost:3306/learnparam-value>   
context-param>
package com.LearnMaven.Servlet1;

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;

public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = getServletContext();

        String url = context.getInitParameter("url");

        resp.getWriter().write(url);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

3、请求转发
  @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = getServletContext();
        context.getRequestDispatcher("/demo01").forward(req,resp);
    }

4、读取资源文件

6、HttpServletResponse

web服务器收到客户端的http请求,针对这个请求,分别创建一个代表请求的HTTPServletRequest对象,代表响应一个HttpServletResponse;

  • 如果要获取客户端请求过来参数,找HTTPServletRequest

  • 如果要给客户端响应一些信息,找HTTPServletResponse

1、简单分类

负责向浏览器发送数据的方法

ServletOutputStream getOutputStream() throws IOException;

PrintWriter getWriter() throws IOException;

负责向浏览器发送响应头的方法

  void setCharacterEncoding(String var1);

  void setContentLength(int var1);

  void setContentLengthLong(long var1);

  void setContentType(String var1);

  void setBufferSize(int var1);

    void sendError(int var1, String var2) throws IOException;

    void sendError(int var1) throws IOException;

    void sendRedirect(String var1) throws IOException;

    void setDateHeader(String var1, long var2);

    void addDateHeader(String var1, long var2);

    void setHeader(String var1, String var2);

    void addHeader(String var1, String var2);

    void setIntHeader(String var1, int var2);

    void addIntHeader(String var1, int var2);
2、常见应用
1、向浏览器输出消息
2、下载文件

​ 1、要获取下载文件的路径

​ 2、下载的文件名是啥

​ 3、设置想办法让六七能够支持下载我们需要的东西

​ 4、获取下载路径

​ 5、创建缓冲区

​ 6、获取OutputStream对象

​ 7、将FileOutputStream 流写到buffer缓冲区

​ 8、使用OutputStream缓冲区中的数据输出到客户端

文件下载案列:

package com.learn.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 {
//        1、要获取下载文件的路径
        String realPath="D:\\资料\\JavaWeb\\JavaWeb_Parents\\Response\\src\\main\\resources\\捕获.JPG";
//		2、下载的文件名是啥
        String  filename=realPath.substring(realPath.lastIndexOf("\\")+1);
//		3、设置想办法让浏览器能够支持下载我们需要的东西
        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缓冲区
//		8、使用OutputStream缓冲区中的数据输出到客户端
        while((len=in.read(buffer))>0){
            out.write(buffer,0,len);
        }
        in.close();
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

3、验证码实现

验证码怎么实现?

前端实现

后端实现,需要用到一个Java图片类,生产一个图片

package com.learn.servlet;

import com.sun.org.apache.xpath.internal.operations.Gt;

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 {
        //如何让浏览器3秒自动刷新一次
        resp.setHeader("refresh","3");

        //在内存中创建一个图片
        BufferedImage image=new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
        //得到图片
        Graphics g=(Graphics)image.getGraphics();//笔
        //设置图片的背景颜色
        g.setColor(Color.white);
        g.setFont(new Font(null,Font.BOLD,20));
        g.fillRect(0,0,80,20);
        //给图片写数据
        g.setColor(Color.BLUE);
        g.fillRect(0,0,80,20);
        g.drawString(makeNum(),0,20);

        //告诉浏览器,这个请求用图片的方式打开
        resp.setContentType("image/jpeg");
        //网站存在缓存不让浏览器缓存
        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(999999)+"";
        StringBuffer sb=new StringBuffer();
        for(int  i=0;i<7-num.length();i++){
            sb.append("0");
        }
        num=sb.toString()+num;
        return num;
    }
}

4、实现重定向

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZTYqjB1J-1631325712339)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210709200518850.png)]

B一个web资源受到客户端A的请求后,B他会通知A客户端去访问另外一个web资源,这个过程叫重定向

常年场景:
用户登录

void sendRedirect(String varl)throws IOException;

测试:

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       /*
       resp.setHeader("Location","/re");
       resp.setStatus(302);
        */       
        resp.sendRedirect("/re");//重定向
    }

面试题:请你聊聊重定向和转发的区别?

相同点:

  • 页面会实现跳转

不同点:

  • 请求转发的时候URL地址栏不会发生变化,重定向的时候URL地址栏会发生变化。

7、HTTPServletRequest

1、获取前端擦书,请求转发
 @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        //获取前端的参数
        String username=req.getParameter("username");
        String password=req.getParameter("password");//获取前端单个值的参数
        String[] hobbys = req.getParameterValues("hobbys");//获取前端多个值的参数

        System.out.println("===============================");
        System.out.println(username);
        System.out.println(password);
        System.out.println(Arrays.toString(hobbys));
        System.out.println("===============================");
        //通过请求转发
        req.getRequestDispatcher("/success.jsp").forward(req,resp);
    }

面试题:请你聊聊重定向和转发的区别?

相同点:

  • 页面会实现跳转

不同点:

  • 请求转发的时候URL地址栏不会发生变化;307
  • 重定向的时候URL地址栏会发生变化;302

(二)Cookie、Session

1、会话

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

**有状态会话:**一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话。

你怎么能证明你是西开的学生?

你 西开

  1. 发票 西开给你发票
  2. 学校登记 西开标记你来过

一个网站,怎么证明你来过?

客户端 服务端

1、一个服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了:cookie

2、服务器已经登记你来过了,下次你来的时候我来匹配你:session

2、保存会话的两种技术

cookie:

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

session:

  • 服务器技术(行为),利用这个技术,可以保存用户的会话信息?我们可以把信息或者数据放在Session中

3、Cookie

1、从会话中拿到cookie信息

2、服务器响应给客户端cookie

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ZBSDuA9-1631325712341)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210711173205161.png)]

//Cookie,服务器端从客户端获取
Cookie[] cookies = req.getCookies();//这里犯规数据,说明cookie可能存在的多个
cookie.getName();//获得cookie中key
cookie.getValue();//新建一个cookie中的value
new Cookie("lastLoginTime",System.currentTimeMillis()+"");//新建一个cookie
cookie.setMaxAge(24*60*60);//设置cookie的有效期
resp.addCookie(cookie);//响应给客户端一个cookie


cookie:一般会保存在本地的用户目录下appdata;

一个网站cookie是否存在上限!聊聊细节问题:

  • 一个cookie只能保存一个信息;

  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;

  • Cookie大小有限制:4kb;

  • 300个cookie浏览器上限;

删除Cookie:

  • 不设置有效期,关闭浏览器,自动失效;

  • 设置有效时间为0;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //创建一个cookie,名字必须要和要删除的名字一致
        Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis() + "");

        //将Cookie有效期设置为0,立马过期
        cookie.setMaxAge(0);
        resp.addCookie(cookie);
    }

编码解码:(可以有效解决网页的乱码问题)

URLEncoder.encode("秦疆","utf-8");//编码
URLDecoder.decode(cookie.getValue(),"utf-8");//解码

4、Session(重点)

什么是Session:

  • 服务器会给每一个用户(浏览器)创建一个session对象;
  • 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在
  • 用户登录之后,整个网站都可以访问!–>保存用户的信息;保存购物车写信息……

Session和cookie的区别:

  • Cookie是把用户数据写给用户浏览器,浏览器保存(可以保存多个)
  • Session把用户的数据写到用户独占的Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
  • Session对象由服务器创建

使用场景:

  • 保存一个登录用户
  • 购物车信息
  • 在整个网站中使用经常会使用的数据,我们将它已经保存在Session中;

使用Session:

package com.learn.Servlet;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;

public class SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //解决乱码问题
        resp.setContentType("text/html");
        resp.setCharacterEncoding("UTF-8");
        req.setCharacterEncoding("UTF-8");

        //得到Session
        HttpSession session = req.getSession();

        //给Session中存东西
        session.setAttribute("name","秦疆");

        //获取Session的Id
        String id = session.getId();

        //判断Session不是新创建的
        if(session.isNew()){
            resp.getWriter().write("Session在服务器中创建成功,Id:"+id);
        }else{
            resp.getWriter().write("Session已经在服务器中存在了,Id"+id);
        }

        //Session创建的时候做什么事情:
//        Cookie cookie = new Cookie("JSESSION", id);
//        resp.addCookie(cookie);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}


    //获取Session值
        HttpSession session = req.getSession();
        String name=(String)session.getAttribute("name");
        resp.getWriter().write("姓名:"+name);


    //获取Session值
        HttpSession session = req.getSession();
        //删除Session中的name
       session.removeAttribute("name");
       //注销Session
        session.invalidate();

会话自动过期

 
<session-config>
        <session-timeout>1session-timeout>
session-config>

(三)JSP

1、什么是JSP

Java Server Page:Java服务器端页面,也和Servlet一样,用于动态Web技术

最大特点:

  • 写JSP就像在写HTML
  • 区别:
    • HTML只给用户提供静态的数据
    • JSP页面中可以嵌入JAVA代码,为用户提供动态数据

2、JSP原理

思路:JSP到低怎么执行的!

  • 代码层面没有任何问题
  • 服务器内部工作
    • Tomcat中有一个work目录;
    • IDEA中使用Tomcat的会在IDEA的Tomcat中产生一个work目录

浏览器像服务器发送请求,不管访问什么资源,其实都是在访问Servlet!

JSP最终也会被转换为Java类

JSP本质上就是一个Servlet

//初始化
public void _jspInit(){
    
}
//销毁
public void _jspDestroy(){
    
}
//JSPService
public void _jspService(HttpServletRequest request,HttpServletResqonse response)

1、判断请求

2、内置一些对象

final javax.servlet.jsp.PageCOntext pageContext;     //页面上下文
javax.servlet.http.HttpSession session=null;         //session
final javax.servlet.ServletContext applicateion;     //applicationContext
final javax.servler.ServletConfig config;            //config
javax.servlet.jsp.JspWriter out=null;                //out
final java.lang.Object page=this;                    //page:当前
HTTPServletRequest request;                          //请求
HttpServletRespose response                          //响应

3、输出页面前增加的代码

4、这些内置对象我们可以直接在JSP页面中使用!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xeOOIlUZ-1631325712344)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210712095301387.png)]

在JSP中,只要是JAVA代码就会原封不同的输出

如果是HTML代码,就会转化为如下格式的数据

out.write("\r\n");

3、JSP基础语法

任何语言都有自己的语法,Java中有,JSP作为Java技术的一种应用,它拥有一些自己扩充的语法(了解:知道即可),Java所有语法都支持!

JSP表达式

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

JSP脚本片段

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

Sum="+sum+"

"); %>
<hr>
<%
    int x=10;
    out.println(x);
%>
<p>这是一个JSP文档</p>
<%
    int y=2;
    out.print(y);
%>

<hr>
<%
    for (int i=0;i<5;i++){
%>
<h1>hello word! <%= i%></h1>
<%
    }
%>

JSP声明

<%!
    static{
        System.out.println("Loading Servlet");
    }

    private  int  globalvar=0;

    public void kuang(){
        System.out.println("进入了方法kuang!");
    }
%>

JSP 声明:会被编译到JSP生成java的类中,其他的就会生成到jspService方法中!

在JSP,嵌入Java代码即可!

<%%>   普通JSP语法
<%=%>  取值
<%!%>  声明
<%-- 注释 --%>

JSP的注释。不会在客户端显示,HTML就会!

4、jsp指令

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--定制错误页面--%>
<%--<%@ page errorPage="error/500.jsp" %>--%>

<%--显示的声明这是一个错误的页面--%>
<%@page isErrorPage="false" %>

5、9大内置对象

  • PageContext 存东西
  • Request 存东西
  • Respon
  • Session 存东西
  • Application【ServletContext】 存东西
  • config【ServletConfig】
  • out
  • page
  • exception
<%--内置对象--%>
<%
    pageContext.setAttribute("name1","秦疆1");//保存的数据值在一个页面中有效
    request.setAttribute("name2","秦疆2");//保存的数据只在一个请求中有效,请求转发会携带这个数据
    session.setAttribute("name3","秦疆3");//保存的数据只在一个会话中有效,从打开浏览器到关闭浏览器
    application.setAttribute("name4","秦疆");//保存的数据只在服务器中有效,从打开服务到关闭服务器
%>
<%--脚本中的代码,会被原封不动的生成到.JSP Java
要求:这里面的代码:必须保证java语法的正确性
--%>
<%
    //从pageContext取出,我们通过寻找的方式来
    //从底层到高层(作用域):
    //双亲委派机制
    String name1= (String) pageContext.findAttribute("name1");
    String name2= (String) pageContext.findAttribute("name2");
    String name3= (String) pageContext.findAttribute("name3");
    String name4= (String) pageContext.findAttribute("name4");
    String name5= (String) pageContext.findAttribute("name5");//不存在
%>
<%--使用EL表达式输出--%>

取出的值为:

${name1}

${name2}

${name3}

${name4}

request:客户端向服务器发送请求,产生的数据,用户看完就没用额,比如:新闻,用户看完就没用的!

Session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,购物车

application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如聊天数据

6、JSP标签、JSTL标签、EL表达式


    <dependency>
      <groupId>javax.servletgroupId>
      <artifactId>servlet-apiartifactId>
      <version>2.5version>
    dependency>


    <dependency>
      <groupId>javax.servlet.jspgroupId>
      <artifactId>javax.servlet.jsp-apiartifactId>
      <version>2.3.3version>
    dependency>


    <dependency>
      <groupId>javax.servlet.jsp.jstlgroupId>
      <artifactId>jstl-apiartifactId>
      <version>1.2version>
    dependency>


    <dependency>
      <groupId>taglibsgroupId>
      <artifactId>standardartifactId>
      <version>1.1.2version>
    dependency>
  dependencies>

EL表达式:${}

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

JS标签

<%--jsp:include--%>
<%--
 http://localhost:8080/jsptag.jsp?name=kuangsheng&age=12   
 --%>

    
    

JSTL表达式

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

核心标签(掌握部分)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lXMx0FM6-1631325712345)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210712202903294.png)]

JSTL标签库使用步骤

  • 引入对应taglib
  • 使用其中的方法
  • 在Tomcat也需要引入JSTL的包,否则会报错:JSTL解析错误

格式化标签

SQL标签

XML标签

(四)JavaBean

实体类

JavaBean有特有的写法:

  • 必须要有一个无参构造
  • 属性必须私有化
  • 必须有对应的get/set方法

一般用来和数据库的字段做封装

(五)MVC三层架构

什么是MVC:Model、View、Controller、模型、视图、控制器

1、早些年

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wk9KFCEP-1631325712347)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210712225756409.png)]

用户直接访问控制层,控制层就可以直接操作数据库

Servlet--CURD--数据库
弊端:程序十分臃肿,不利于维护
Servlet的代码中:出路请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码
    
架构:没有什么是加一层解决不了的
    
JDBC
    
MySQL  Orale SQLServlet……

2、MVC三层架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SZDetOCi-1631325712348)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210712230740691.png)]

Model

  • 业务处理:业务逻辑(Service)
  • 数据持久层:CRUD(dao)

View

  • 展示数据
  • 提供链接发起Servlet请求(a,form,img……)

Controller

  • 接收用户的请求;(req:请求参数,Session信息……)
  • 交给业务层出路对应的代码
  • 控制视图的跳转
登录--->接收用户的登录请求--->处理用户的请求(获取用户登录的参数,username,password)--->交给业务层处理登录业务(判断用户名密码是否正确:事物)-->Dao层查询用户名和密码是否正确-->数据库

(六)Filter

Filler:过滤器,用来过滤网站的数据;

  • 处理中文乱码
  • 登录验证

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ESQMt7aS-1631325712348)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210713125143464.png)]

filter过滤步骤:

1、导包

2、编写过滤器

  • 导包不要导错了

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qr1uiYJE-1631325712349)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210713142537175.png)]

  • 实现Filter接口,重写对应的方法即可

package com.learn.Filler;

import javax.servlet.*;
import java.io.IOException;

public class CharacterEncodingFilter implements Filter {
    //初始化:web服务器启动,就已经初始化,随时等待过滤对出现!
    public void init(FilterConfig filterConfig) throws ServletException {

        System.out.println("CharacterEncodingFiller初始化");
    }

    //Chain:链
    /*
    1、过滤中的所有代码,在过滤特定定请求的时候都会执行
    2、必须要让过滤继续通行

     */
    public 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");

        System.out.println("CharacterEncodingFiller执行前……");
        filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走,如果不写,程序将在这停止!
        System.out.println("CharacterEncodingFiller执行后……");
    }

    //销毁:web服务器关闭额时候,过滤器会销毁
    public void destroy() {

        System.out.println("CharacterEncodingFiller销毁");
    }
}

  • 在web.xml中配置Filter
 <filter>
    <filter-name>CharacterEncodingFilterfilter-name>
    <filter-class>com.learn.Filler.CharacterEncodingFilterfilter-class>
  filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilterfilter-name>

    <url-pattern>/servlet/*url-pattern>
  filter-mapping>

(七)监听器

实现一个监听器的接口:(有N种)

1、编写一个监听器

实现监听器接口

package com.learn.listener;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

//统计网站在线人数:统计Session
public class OnlineCountListener implements HttpSessionListener {
    //创建session的监听
    //一旦创建一个session就会触发一次这个事件
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {

        ServletContext Context = httpSessionEvent.getSession().getServletContext();
           Integer  onlineCount = (Integer) Context.getAttribute("OnlinCount");
           if(onlineCount==null){
               onlineCount=new Integer(1);
           }else{
               int count=onlineCount.intValue();
               onlineCount=new Integer(count+1);
           }
           Context.setAttribute("OnlinCount",onlineCount);
    }

    //销毁Session的监听
    //一旦销毁Session就会触发一次这个事件
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        ServletContext Context = httpSessionEvent.getSession().getServletContext();
        httpSessionEvent.getSession().invalidate();
        Integer  onlineCount = (Integer) Context.getAttribute("OnlinCount");
        if(onlineCount==null){
            onlineCount=new Integer(1);
        }else{
            int count=onlineCount.intValue();
            onlineCount=new Integer(count-1);
        }
        Context.setAttribute("OnlinCount",onlineCount);

    }
}

2、注册监听器

 <listener>
    <listener-class>com.learn.listener.OnlineCountListenerlistener-class>
  listener>

3、看情况是否使用

(八)过滤器、监听器常见应用

监听器:GUI编程中经常使用;

用户登录之后才能进入首页,用户注销后不能进入首页了!

1、用户登录之后,向Session中放入用户 的数据

2、进入主页的时候要判断用户是否已经登录:要求:在过滤器中实现!

     HttpServletRequest req=(HttpServletRequest)servletRequest;
        HttpServletResponse resp=(HttpServletResponse)servletResponse;

        Object id = req.getSession().getAttribute("USER_SESSION");
        if (id==null){
            resp.sendRedirect("/JavaWeb_Filler_war/error/error.jsp");
        }
        filterChain.doFilter(req,resp);
    }

(九)JDBC

什么是JDBC:Java连接数据库!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OCnSMTog-1631325712350)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210713221917119.png)]

需要jar包的支持:

  • java.sql

  • javax.sql

  • mysql-conner-java……连接驱动(必须要导入的)

实验环境搭建:

JDBC固定步骤:

1、加载驱动

2、连接数据库,代表数据库

3、向数据库发送SQL的对象Statement:CRUD

4、编写SQL(根据业务,不同的SQL)

5、执行SQL

6、关闭连接

事物

要么都成功,要么都失败

ACID原则:保证数据的安全。

开启事物
事物提交 commit()
事物回滚 rollback()
关闭事物
    
转账
A1000
B1000
    
A(900) ----100---B(1100)

Junit单元测试

依赖

简单使用

@Test注解只有在放上有效,只要加了这个注解的方法,就可以直接运行!

@Test
public void test(){

    System.out.println("Hello!");
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mr3JtWLt-1631325712352)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210714091012865.png)]

失败的时候是红色的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kguOukbQ-1631325712353)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210714091129849.png)]

``xml-dtd

com.learn.listener.OnlineCountListener


3、看情况是否使用

# (八)过滤器、监听器常见应用

监听器:GUI编程中经常使用;

用户登录之后才能进入首页,用户注销后不能进入首页了!

1、用户登录之后,向Session中放入用户 的数据

2、进入主页的时候要判断用户是否已经登录:要求:在过滤器中实现!

```java
     HttpServletRequest req=(HttpServletRequest)servletRequest;
        HttpServletResponse resp=(HttpServletResponse)servletResponse;

        Object id = req.getSession().getAttribute("USER_SESSION");
        if (id==null){
            resp.sendRedirect("/JavaWeb_Filler_war/error/error.jsp");
        }
        filterChain.doFilter(req,resp);
    }

(九)JDBC

什么是JDBC:Java连接数据库!

[外链图片转存中…(img-OCnSMTog-1631325712350)]

需要jar包的支持:

  • java.sql

  • javax.sql

  • mysql-conner-java……连接驱动(必须要导入的)

实验环境搭建:

JDBC固定步骤:

1、加载驱动

2、连接数据库,代表数据库

3、向数据库发送SQL的对象Statement:CRUD

4、编写SQL(根据业务,不同的SQL)

5、执行SQL

6、关闭连接

事物

要么都成功,要么都失败

ACID原则:保证数据的安全。

开启事物
事物提交 commit()
事物回滚 rollback()
关闭事物
    
转账
A1000
B1000
    
A(900) ----100---B(1100)

Junit单元测试

依赖

简单使用

@Test注解只有在放上有效,只要加了这个注解的方法,就可以直接运行!

@Test
public void test(){

    System.out.println("Hello!");
}

[外链图片转存中…(img-Mr3JtWLt-1631325712352)]

失败的时候是红色的:

[外链图片转存中…(img-kguOukbQ-1631325712353)]

你可能感兴趣的:(spring,maven,java)