Maven

在javaweb开发中,需要使用大量的jar包需要我们手动去导入;

如何能够让一个东西自动帮我导入和配置这个jar包,由此Maven诞生了

 1、Maven项目架构管理工具

       我们目前用来就是方便导入jar包的

        Maven的核心思想:约定大于配置

                有约束,不要去违反

Servlet

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

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

        编写一个类,实现Servlet接口

        把开发好的Java类部署到web服务器中

实现了Servlet接口的Java程序叫做,Servlet 

Servlet就JavaWeb三大组件之一。三大组件分别是:Servlet程序、Filter过滤器。Listener监视器

HelloServlet:

1、构建一个普通的Maven项目,删掉里面的src目录,建立Moudel;空的工程就是Maven主工程

 在Maven主工程中导入相关的依赖

<dependencies>
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
    </dependencies>

2、关于父子工程的理解:

父工程中会有:

子工程中会有:

子工程没有parent需要手写打入

 父工程的java项目子工程继承后直接使用

3、Maven环境优化

将子工程web.xml文件换成最新的

<?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">
</web-app>

 子工程中main文件中需要自己搭建结构

4、编写一个Servlet程序

        编写一个普通股类

        实现一个Servlet接口,我们直接继承HttpServlet

        

package com.xx.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 {
    //由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("进入doGet方法");
        PrintWriter writer = resp.getWriter();//响应流
        writer.print("hello,servlet");
    }

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

 编写Servlet的映射

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

配置Tomcat后测试

5、Mapping问题

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

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

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

默认请求路径: 

指定一些后缀或者前缀等等...

优先级问题:

        指定了固有的映射路径,优先级最高,如果找不到就会默认的处理请求 

6、ServletContext (servlet上下文)

response的setContentType() 方法用于设置发送到客户端的响应的内容类型

参数类型有以下几种: text/html  application/msword 等

setCharacterEncoding() 用来确保发往服务器的参数的编码格式

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

        共享数据

        我在这个Servlet中保存的数据,可以在另一个servlet中拿到

 

应用:

7、HttpServletResponse

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

        如果要获取客户端请求过来的参数:找HttpServletRequest

        如果要给客户端响应一些信息:找HttpServletResponse

简单分类:

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

servletOutputStream getOutputStream() throws IOException;

PrintWriter getwriter() throws IOException;

常见应用

        1、向浏览器输出消息

        2、下载文件

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

                2、下载的文件名是啥

                3、设置想办法让浏览器能够支持我们下载的东西

                4、获取下载文件的输入流

                5、创建缓冲区

                6、获取OutputStream对象

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

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

package com.xx.com;

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="C:\\Users\\ASUS\\untitled8\\untitled-03\\target\\classes\\1.png";
        System.out.println("下载文件的路径:"+realPath);
        //2、下载的文件名
        String fileName=realPath.substring(realPath.lastIndexOf("\\")+1);

        //3、设置想办法让浏览器能够支持(Content-Disposition)我们下载的东西,中文文件名URLEncoder.encode编码,否则有可能乱码
        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缓冲区
        while((len=in.read(buffer))>0){
            out.write(buffer,0,len);
        }
        in.close();
        out.close();
        //8、使用OutputStream将缓冲区中的数据输出到客户端
    }

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

验证码功能

验证怎么来的

        前端实现

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

package com.xx.com;

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","5");
        //在内存中创建一个图片
        BufferedImage Image=new BufferedImage(80,20,BufferedImage.TYPE_3BYTE_BGR);
        //得到图片
        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/jpeg");
        //网站存在缓存,不让浏览器缓存
        resp.setDateHeader("expires",-1);
        resp.setHeader("Cache-control","no-cache");
        resp.setHeader("pragam","no-cache");
        //把图片写给浏览器
        boolean write=ImageIO.write(Image,"jpeg",resp.getOutputStream());
    }
    //生成随机数
    private String makeNum(){
        Random random = new Random();
        String num=random.nextInt(9999)+"";
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<4-num.length();i++){
            sb.append("0");
        }
        String s=sb.toString()+num;
        return num;
    }

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

实现重定向

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

常用场景:

        用户登录

void sendRedirect(String var1) throws IOException

测试:

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

面试题:重定向和转发的区别

相同点:

        页面都会发生跳转

不同点:

         请求转发的时候,url不会发生变化

        重新定向的时候,url会发生变化

8、HttpServletRequest

HttpServletRequest代表客户端的请求,用户通过http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest

1、获取前端传递的参数

9、Cookie、Session

存储位置不同: cookie是保存在客户端, session是保存服务器端 2. 存储数据量大小不同: cookie存储是有限的, 不超过4KB, seesion是无限制的;

 会话

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

有状态的会话

一个网站怎么证明来过?

客户端                服务器

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

2、服务端登记你来过了,下次你来的时候我来匹配你;seesion

10、保存会话的两种性质

cookie

客户端技术(响应 请求)

session

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

常见场景:网站登陆之后,你下次不用在登陆了,第二次访问直接就上去了

Cookie

        1、从请求中拿到cookie信息

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

Cookie[] cookies=req.getcookies();        //获得Cookie

cookie.getName();        //获得cookie中的key

cookie.getvalue();        //获得cookie中的value

new Cookie("lastLoginTime",System.out.curremtTimeMillis(),"")        //新建一个cookie

cookie.setMaxAge(24*60*60)        //设置cookie的有效期

resp.addCookie(cookie);        //响应给客户端一个cookie

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

        一个Cookie只能存一个信息

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

        Cookie大小有限制4kb

        300个cookie浏览器上限

删除Cookie:

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

        设置有效日期为0

Session

服务器会给每一个用户(流浪器)创建一个Session对象

一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在

用户登录之后,整个网站都可以访问!保存用户信息

Session和Cookie的区别

Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)

Session把用户的数据写到用户独占Session中,服务器保存(保存重要的信息,减少服务器资源的浪费)

Session由服务器创建

11、JSP

1、Java Server Pages: Java服务器端页面,也和Servlet一样,用于动态Web!

最大特点:

        写JSP就像写HTML

        区别:

                HTML只给用户提供静态的数据

                JSP页面中可以嵌入JAVA代码,为用户提供动态数据;

2、JSP原理

思路:JSP到底怎么执行的

JSP本质上就是一个Servlet

//初始化

public void _jspInit(){

}

//销毁

public void _jspDestroy(){

}

//JSPService

publivc void _jspService(. HttpServletRequest request,HttpServletResponse response)

在JSP页面中:

只要是JAVA代码就会原封不动的输出

如果是HTML代码,就会被转换为

out.write("<html>/r/n")

这样的格式,输出到前端 

JSP基础语法

 JSP作为java技术的一种应用,它拥有一些自己扩充的语法,java语法都支持

JSP表达式

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

JSP脚本片段

<%
    int sum=0;
    for(int i=1;i<=100;i++){
        sum+=i;        
    }
    out.println("<h1>Sum="+sum+"<h1>");
%>

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

<%!%>

<%@include%> 拼接页面

12、JavaBean

实体类

JavaBean有特定的写法:

        必须要有一个无参构造

        属性必须私有化

        必须有对应的get/set方法

        一般用来和数据库的字段做映射 ORM

        ORM:对象关系映射

                表--->类

                对象--->属性

13、MVC三层架构 

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

Model

        业务处理:业务逻辑(Service)

        数据持久层:CRUD(Dao)

View

        展示数据

        提供连接发起Servlet请求(a,from,img...)

Controller(Servlet)--

        接收用户的请求:(req:请求参数、Session信息...)

        交给业务层处理对应的代码

        控制视图的跳转

登录--->接收用户的登录请求--->处理用户的请求(获取用户登录的参数,username,password)--->交给业务层处理登录业务(判断用户名密码是否正确:事物)--->Dao层查询用户名和密码是否正确--->数据可

14、Filter(过滤器)

用来过滤网站的数据

处理中文乱码

Filter开发步骤

1、导包

2、编写过滤器

        导包不要错

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

package com.xx.filter;

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

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

    }
    /*
    Chain:链
    1、过滤中的所有代码,在过滤特定请求的时候都会执行
    2、必须要让过滤器继续通行
    */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("GBK");
        servletResponse.setCharacterEncoding("GBK");
        servletResponse.setContentType("text/html;charset=GBK");
        System.out.println("CharacterEncodingFilter执行前...");
        filterChain.doFilter(servletRequest,servletResponse);//让我们请求继续走,如果不写,程序到这里就被拦截停止
        System.out.println("CharacterEncodingFilter执行后...");
    }
    //销毁
    @Override
    public void destroy() {
        System.out.println("CharacterEncodingFilter销毁");
    }
}

 在web.xml中配置 Filter

    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.xx.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <!--只要是 /servlet的任何请求,会经过这个过滤器-->
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>

15、监听器

实现一个监听器的接口

16、JDBC

jdbc的固定步骤

        1.加载驱动

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

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

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

        5.执行SQL

        6.关闭连接

package com.xx.test;

import java.sql.*;

public class TestJdbc {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //配置信息
        String username="root";
        String password="123456";
        String url="jdbc:mysql://localhost:3306/jdbc?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8";
        //加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //连接数据库,代表数据库
        Connection connection = DriverManager.getConnection(url, username, password);
        //向数据库发送SQL的对象Statement:CRUD
        Statement statement = connection.createStatement();
        //编写sql
        String sql="select * from users";
        //执行查询SQL,返回一个ResultSet:结果集
        ResultSet rs = statement.executeQuery(sql);
        while (rs.next()){
            System.out.println("id"+rs.getObject("id"));
            System.out.println("name"+rs.getObject("name"));
            System.out.println("password"+rs.getObject("password"));
            System.out.println("email"+rs.getObject("email"));
        }
        //关闭连接,释放资源(一定要做)先开后关
        rs.close();
        statement.close();
        connection.close();
    }

}

预编译SQL

package com.xx.test;

import java.sql.*;

public class TestJDBC2 {
    public static void main(String[] args) throws Exception {
        //配置信息
        String username="root";
        String password="123456";
        String url="jdbc:mysql://localhost:3306/jdbc?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8";
        //加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //连接数据库,代表数据库
        Connection connection = DriverManager.getConnection(url, username, password);
        //3.编写SQL
        String sql="insert into users(id,name,password,email) values (?,?,?,?)";
        //预编译
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1,4);//给第一个占位符?赋值为1
        preparedStatement.setString(2,"花荣");//给第2个占位符?赋值为花荣
        preparedStatement.setString(3,"123456");//给第3个占位符?赋值
        preparedStatement.setString(4,"hr@qq.com");//给第4个占位符?赋值
        //执行SQL
        int i = preparedStatement.executeUpdate();
        if (i>0){
            System.out.println("插入成功");
        }
        //关闭连接,释放资源(一定要做)先开后关
        preparedStatement.close();
        connection.close();
    }

}


事物

要么都成功,要么都失败

ACID原则:保证数据的安全

开启事物

事物提交        commit()

事物回滚        rollback()

关闭事物

Junit单元测试 

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
</dependency>

简单使用

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

package com.xx.test;

import org.junit.Test;

public class TestJdbc3 {
    @Test
    public void test(){
        System.out.println("hello");
    }
}

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐