java后端第二阶段:JavaWeb

news2024/12/27 11:43:53

一、Mysql


        定义:关系型数据库,存储在硬盘数据安全。

1.SQL通用语法

注释:

        单行注释 -- 注释内容 或  #注释内容(MySQL特有)

        多行注释 /* 注释 */       

DDL:操作数据库,表等

DML:对表中的数据进行增删改

DQL:对表中的数据进行查询

DCL:对数据库进行权限控制 

2.DDL-操作数据库

查询:SHOW DATABASES;

创建:

        (1)创建数据库:CREATE DATABASE 数据库名称;

        (2)创建数据库(判断,如果不存在则创建):CREATE DATABASE IF NOT EXISTS 数据库名称;

删除:

        (1)删除数据库:DROP DATABASE 数据库名称;

        (2)删除数据库(判断,如果存在则删除):DROP DATABASE IF EXISTS 数据库名称;

查看当前使用的数据库:SELECT DATABASE();

使用数据库:USE 数据库名称

3.DDL-操作表

查询当前数据库下的表:SHOW TABLES;

查询表结构:DESC 表名称;

创建表:

        CREATE TABLE 表名(

                字段1 数据类型1,

                字段2 数据类型2);

数据类型:int、float、double、date、datetime、varchar、text等;double使用存储100.02这样的数double(总长度,小数保留的位数) double(5,2)

删除表:

        删除表:DROP TABLE 表名

        删除表时判断表是否存在:DROP TABLE IF EXISTS 表名;

修改表:

        修改表名:ALTER TABLE 表名 RENAME TO 新的表名;

        添加一列:ALTER TABLE 表名 ADD 列名 数据类型;

        修改数据类型:ALTER TABLE 表名 MODIFY 列名 新数据类型;

修改列名和数据类型:ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;

删除列:ALTER TABLE 表名 DROP 列名;

4.DML-操作数据

添加数据:

        1.给指定列添加数据:INSERT INTO 表名(列名1,列名2...)VALUES(值1,值2....);

        2.给全部列添加数据:INSERT INTO 表名VALUES(值1,值2....);

        3.批量添加数据:

                INSERT INTO 表名 (列名1,列名2...) VALUES(值1,值2....),(值1,值2....);

                INSERT INTO 表名 VALUES(值1,值2....),(值1,值2....);

修改数据:UPDATE 表名 SET 列名1=值1,列名2=值2,...[WHERE 条件]

删除数据:DELETE FROM 表名 [WHERE 条件];

5.DQL-数据查询

基础查询:SELECT [DISTINCT] 列名 AS 别名 FROM 表名                #DISTINCT:去除重复数据            #AS:起别名

条件查询:SELECT 列名 FROM 表名 WHERE 条件列表;

排序查询:SELECT 列名 FROM 表名 ORDER BY 排序字段1 [排序方式1],排序字段1 [排序方式2]...;         ASC:升序(默认)         DESC:降序排序

聚合函数:COUNT(列名):个数 MAX最大值 MIN最小值 AVG平均值 SUM求和        SELECT 聚合函数(列名) FROM 表;

分组查询:SELECT 字段列表 FROM 表名 [WHERE 分组前条件] GROUP BY 分组字段名 [HAVING 分组后条件过滤]

分页查询:SELECT 字段列表 FROM 表名 LIMIT 起始索引 , 查询条目数;        计算公式:起始索引=(当前页码-1)* 每页显示的条数

6.约束

约束分类:NOT NULL:非空约束 UNIQUE:唯一约束 PRIMARY KEY:主键约束 CHECK:检查约束(不常用)

外键约束:

        CREATE TABLE 表名([CONSTRAINT] 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称));

        ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);

7.多表查询

内连接:查询交集

        隐式内连接:SELECT 字段列表 FROM 表1,表2... WHERE 条件;

        显示内连接:SLELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;

外连接:左外连接:查询A表所有数据和交集部分数据;右外连接:查询B表所有数据和交集部分数据

        左外连接:SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件

        右外连接:SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件

子查询:查询中嵌套查询

        单行单列:SELECT 字段列表 FROM 表 WHERE 字段名 = (子查询)

        多行单列:SELECT 字段列表 FROM 表 WHERE 字段名 in (子查询)

        多行多列:SELECT 字段列表 FROM(子查询)WHERE 条件

8.事务

        原子性----一致性---隔离性---持久性

        START TRANSACTION 或者 BEGIN   #开启事务

        COMMIT;        #提交事务

        ROLLBACK         #回滚事务

二、JDBC


1.入门案例

#1.导入jar包 mysql-contror-java-8.0.23.jar
#2.注册驱动 Class.forName("com.mysql.jdbc.Driver); #8.0使用com.mysql.cj.jdbc.Driver
#8.0使用jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=UTC
#3.获取链接 Connection conn = DriverManager.getConnerction(url,username,password) 
#4.定义sql语句 String sql = "update.."
#5.获取执行SQL对象Statement stmt = createStatement();
#6.执行SQL stmt.exeuteUpdate(sql)
#7.处理返回结果
#8.释放资源
conn.close()   stmt.close()

2.JDBC的API详解

DriverManager:连接驱动管理

Connection:连接,获取执行的sql对象;

        开启事务:setAutoCommit(boolean autoCommit);true为自动提交事务;false为手动提交事务,即为开启事务

        提交事务:commit()        回滚事务:rollback()

Statement:执行sql语句

        int executeUpdate(sql):执行DML、DDL语句        返回影响行数

        ResultSet executeQuery(sql):执行DQL语句        返回ResultSet结果集

ResultSet:结果集返回查询结果    ResultSet.next()判断是否有下一列   ResultSet.getInt(1)获取这列的第一个值。索引从1开始 ResultSet.getInt("id")

PreparedStatement:防止sql注入

        (1)获取prepareStattement预编译对象

String sql = "select * from account where id = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);

        (2)设置参数值:pstmt.setString(1,id)

String id = "1";
pstmt.setString(1,id);

        (3)执行sql

ResultSet resultSet = pstmt.executeQuery();

3.Druid使用

使用步骤:1.导入jar包druid    2.定义配置文件    3.加载配置文件   4.获取数据连接池对象    5.获取连接

(1)在src下创建druid.properties文件

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=UTC
username=root
password=root
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000

(2)主代码

public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        prop.load(new FileInputStream("src/druid.properties"));
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
    }

4.案例

(1)在src下新建druid.properties配置文件

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=UTC
username=root
password=root
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000

(2)初始化Account实体类

@Data
public class Account {
    //这里不用int是因为int有初始值
    private Integer id;
    private String name;
    private Double balance;
}

(3)查询account所有用户

public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        prop.load(new FileInputStream("src/druid.properties"));
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        Connection connection = dataSource.getConnection();
        String sql = "select * from account";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery();
        List<Account> accountList = new ArrayList<Account>();
        while (resultSet.next()){
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            double balance = resultSet.getDouble("balance");
           accountList.add(new Account(id,name,balance));
        }
        System.out.println(accountList);
    }

(4)添加一个用户数据

public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        prop.load(new FileInputStream("src/druid.properties"));
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        Connection connection = dataSource.getConnection();
        String sql = "insert into account values(null,?,?)";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        Scanner scanner  = new Scanner(System.in);
        String name = scanner.next();
        Double balance = scanner.nextDouble();
        preparedStatement.setString(1,name);
        preparedStatement.setDouble(2,balance);
        int i = preparedStatement.executeUpdate();
        System.out.println(i == 1 ?"成功":"失败");
        connection.close();
    }

(5)根据id删除一个用户

 public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        prop.load(new FileInputStream("src/druid.properties"));
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        Connection connection = dataSource.getConnection();
        String sql = "delete from account where id = ?";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        Scanner scanner  = new Scanner(System.in);
        Integer id = scanner.nextInt();
        preparedStatement.setInt(1,id);
        int i = preparedStatement.executeUpdate();
        System.out.println(i == 1 ?"成功":"失败");
        connection.close();
    }

(6)跟据id更新用户数据

public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        prop.load(new FileInputStream("src/druid.properties"));
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
        Connection connection = dataSource.getConnection();
        String sql = "update account set name = ? where id = ?";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        Scanner scanner  = new Scanner(System.in);
        String name = scanner.next();
        Integer id = scanner.nextInt();
        preparedStatement.setString(1,name);
        preparedStatement.setInt(2,id);
        int i = preparedStatement.executeUpdate();
        System.out.println(i == 1 ?"成功":"失败");
        connection.close();
    }

三、Maven


仓库方便管理。符合企业化开发。

1.pom.xml

依赖管理        dependencies/dependcy:依赖引入

依赖范围        scope配置范围        compile        test        provided        runtime        system        import

四、MyBatis


持久层框架;半成品软件;高效的框架;JavaEE三层架构:表现层、业务层、数据层

1.MyBatis快速入门

步骤:

        (1)创建表(2)创建模块,导入坐标(3)编写MyBatis核心配置文件  --> 替换连接信息 解决编码问题

        (4)编写SQL映射文件 --> 统一管理sql语句,解决编码问题

        (5)编码

                1.编写POJO类。2.加载核心配置文件,获取SqlSessionFactory 对象3.获取SqlSession对象,执行SQL语句。4.释放资源

导入MyBatis坐标 pom.xml

<dependency>
   <groupId>org.mybatis</groupId>
   <artifactId>mybatis</artifactId>
   <version>3.5.5</version>
</dependency>

编写MyBatis配置文件 在resourese/mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
<!--                mybatis的核心配置文件-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/jdbc?useSSL=false&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
<!--                mybatis的映射文件-->
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

编写SQL映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--namespace:命名空间-->
<mapper namespace="test">
<!--com.itheima.pojo.Account是pojo类-->
    <select id="selectAccount" resultType="com.itheima.pojo.Account">
        select * from account;
    </select>
</mapper>

编码写POJO类

@Data
public class Account {
    //这里不用int是因为int有初始值
    private Integer id;
    private String name;
    private Double balance;
}

编写主类

public static void main(String[] args) throws Exception {
        //1.加载mybatis的核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream resourceAsStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //2.获取SqlSession对象,用来执行sql
        SqlSession sqlSession = build.openSession();
        //3.执行sql
        List<Account> accounts = sqlSession.selectList("test.selectAccount");
        System.out.println(accounts);
        sqlSession.close();
    }

结构演示图

2.Mapper代理开发

(1)定义SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一个目录下

在java下创建com.itheima.mapper.UserMapper接口文件.方法名为SQL映射文件的ID

public interface UserMapper {
    //selectAll为mapper的id
    List<Account> selectAll();
}

在resourse下创建同名文件夹,将UseMapper文件放入使用这种方法创建文件夹不然会报错 com/itheima/mappper下放UserMapper.xml文件

(2)设置SQL映射文件的namespace属性为Mappper接口全限定名

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--namespace:命名空间-->
<mapper namespace="com.itheima.mapper.UserMapper">
    <select id="selectAll" resultType="com.itheima.pojo.Account">
        select * from account;
    </select>
</mapper>

(3)主代码

 public static void main(String[] args) throws Exception {
        //1.加载mybatis的核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream resourceAsStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //2.获取SqlSession对象,用来执行sql
        SqlSession sqlSession = build.openSession();
        //3.执行sql
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<Account> accounts = mapper.selectAll();
        System.out.println(accounts);
        sqlSession.close();
    }

3.MyBatis核心配置文件---mybais-config.xml

类型别名:<typeAliases><package name="com.itheima.pojo"></typeAliases>

4.案例

数据库表的字段名称和实体类的属性名称不一样则不能自动封装数据

<mapper namespace="com.itheima.mapper.UserMapper">
    <resultMap id="accountResultMap" type="com.itheima.pojo.Account">
<!--        id:为主键-->
        <id column="id" property="id"></id>
<!--        result为一般字段 column为列名 property为实体类的属性名-->
        <result column="user_name" property="name" />
    </resultMap>

    <select id="selectAll" resultMap="accountResultMap">
        select * from account;
    </select>
</mapper>

参数注入sql语句,使用        #{id}:这个可以防止sql注入,使用?号占位(推荐使用)        ${id}:直接插入不推荐使用        

        注意:字符问题使用转义字符

#mapper接口
public interface UserMapper {
    List<Account> selectById(int id);
}
#mapper映射文件
<mapper namespace="com.itheima.mapper.UserMapper">
    <select id="selectById" resultType="com.itheima.pojo.Account">
        select * from account where id = #{id};
    </select>
</mapper>

SQL语句设置多个参数

<mapper namespace="com.itheima.mapper.UserMapper">
    <select id="selectById" resultType="com.itheima.pojo.Account">
        select * from account where id = #{id} and name like #{name};
    </select>
</mapper>

        (1)散装参数:需要使用@Param("SQL中的参数占位符名称")

public interface UserMapper {
    List<Account> selectById(@Param("id") int id,@Param("name") String name);
}

        (2)实体类封装参数:只要保证sql中的参数名和实体类对应上,即可设置成功

public interface UserMapper {
    List<Account> selectById(Account account);
}

        (3)map集合:只需要保证SQL中的参数名和map集合的键的名称对应上,即可设置成功

public interface UserMapper {
    List<Account> selectById(Map map);
}

动态条件查询

<mapper namespace="com.itheima.mapper.UserMapper">
    <select id="selectById" resultType="com.itheima.pojo.Account">
        select * from account where 1 = 1
        <if test="id != null and id != ''">
            and id = #{id}
        </if>
        <if test="name != null and name != ''">
            and name like #{name}
        </if>
    </select>
</mapper>

5.MyBatis事务

openSession():默认开启事务,进行增删改操作需要使用sqlSession.commit();手动提交

openSession(true):可以设置为自动提交

6.返回添加数据的主键

<insert id="addUser" useGeneratedKeys="true" keyProperty="id">
        insert into account values (#{name},#{balance})
    </insert>

7.注解开发

查询:@Select        添加:@Insert        需改:@Update        删除:@Delete        提示:注解完成简单功能,配置文件完成复杂内容

public interface UserMapper {
    @Select("select * from account where id = #{id}")
    Account selectAccountById(int id);
}

五、HTML、CSS、Vue、Axios、Element_ui


        已学、笔记在宁一篇文档。前端技术,负责页面展示。

六、HTTP


1.HTTP简介

        Hyper Text Transfer protoclo,超文本传输协议,规定了浏览器和服务器之间的数据传输规则

        特点:面向连接安全 ,一次响应对应一次请求。速度快,请求间不能共享数据。

2.HTTP-请求数据格式

        请求行、请求头、请求体

3.HTTP-响应数据格式

        相应行、响应头、响应体        400:响应中        200:成功        300:重定向        400:客户端错误        500:服务器错误

七、Tomcat


        web服务器软件,

1.修改服务端口

        在tomcat目录下的conf\service.xml里面修改

八、Servlet


1.servlet快速入门

创建web项目,导入Servlet依赖坐标---注意jdk版本为1.8哦

dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>javax.servlet-api</artifactId>
   <version>3.1.0</version>
   <scope>provided</scope>
</dependency>

创建:定义一个类,实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话

配置:在类上使用@WebServlet注解,配置该Servlet的访问路径

访问:启动Tomcat,浏览器输入URL,访问该Servlet

@WebServlet("/demo1")
public class ServletDemo1 implements Servlet {
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    public ServletConfig getServletConfig() {
        return null;
    }

    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("tomcat快速入门");
    }

    public String getServletInfo() {
        return null;
    }

    public void destroy() {

    }
}

2. Servlet的生命周期

@WebService(urlPatterns="/demo",loadOnStartup = 1)   loadOnStartup:负整数第一次访问创建,0或正整数:启动时创建,数字越小优先级越高

Servlet周期:加载和实例化        初始化:init()方法,只调用一次        请求处理:service()访问就触发        服务终止:destroy()垃圾回收

Servlet其他方法(不常用):获取ServletConfig对象 ServletConfig getServletConfig()        获取Servlet信息   String getServletInfo()

3.Servlet体系结构

Servlet(Servlet体系结构根接口)<====GenericServlet(Servlet抽象实现类)<====HttpServlet(对HTTP协议封装的Servlet实现类)

我们将来开发B/S架构的web项目,都是针对HTTP协议,所以我们自定义Servlet,会继承HttpServlet

@WebServlet("/demo2")
public class Demo2Controller extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("GET...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("POST...");
    }
}

4.urlPattern配置

一个Servlet可以匹配多个urlPattern:@WebServlet(urlPatterns={"/demo1","/demo2"})

urlPattern匹配规则:

        精确匹配:WebServlet("/user/select")

        目录匹配:WebServlet("/user/*")

        扩展名匹配:WebServlet("*.do")

        任意匹配:WebServlet("/") 或 WebServlet("/*")

5.XML配置Servlet(了解)

Servlet从3.0版本之后开始支持使用注解配置(@WebServlet),3.0版本前只支持XML的配置方式

        步骤:1.编写Servlet类 2.在web.xml中配置Servlet

        xml文件在webapp/WEB-INF/web.xml

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>demo3</servlet-name>
    <servlet-class>com.itheima.controller.Demo3Controller</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>demo3</servlet-name>
    <url-pattern>/demo3</url-pattern>
  </servlet-mapping>
</web-app>

九、Request


1.Request获取请求数据

请求行:

        String getMethod():获取请求方式;GET        

        String getContextPath():获取虚拟牡蛎:/requset-demo

        StringBuffer getRequesrURL():获取URL(统一资源定位符):http://localhost/request-demo/req1

        String getRequstURL():获取URL(统一资源定位标识符):requset-demo/req1

        String getQieryString():获取请求参数(GET方式):username=zhangsan&password=123

请求头:String getHeader(String name):根据请求头名称,获取值

请求体:

        ServletInputStream getInputStream():获取字节输入流

        BufferedReader getReader():获取字符输入流

获取参数的通用方式:

        Map<String,String[]> getParamterMaper():获取所有参数Map集合

        String[] getParameterValues(String name):根据名称获取参数值(数组)(常用)

        String getParametr(String name):根据名称获取参数值(单个值)

在doPost里面调用doGet方法:this.doGet(request,response)

2.请求参数中文乱码处理

设置:request.setCharacterEncoding("UTF-8")    POST请求的

GET在Tomcat8之后他自己解决了

3.Request请求转发

实现方式:request.getRequestDispatcher("资源B路径").forward(req,resp);

请求转发资源间共享数据:使用Requst对象

        void setAttribute(String name,Object p):存储数据到request域中

        Object getAttribute(String name):根据key,获取值

        void removeAttribute(String name):根据key,删除该键值对

十、Response


1.设置Response

响应行:void setStatus(int sc):设置响应状态码

响应头:void setHeader(String name,String value):设置响应头键值对

响应体:printWriter getWriter():获取字符输出流

ServletOutPutStream getOuptPutStream():获取字节输出流

2.Response-重定向

实现方式一:response.setStatus(302);        response.setHeader("location","资源B的路径"); 

实现方式二:response.sendRedirect("资源B的路径");

3.路径问题

4. Response响应字符数据

response.setContentType("text/html;charset=utf-8")设置编码        PrintWriter writer = resp.getWriter();        writer,writer("aaa")    

5.Response响应字节数据

使用:ServletOutPutSteam outputStream = resp.getOutPutStream();        outputStream.write(字节数据)

IOUtils工具类使用

        1.导入坐标:

<dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
</dependency>

        2.使用:IOUtils.copy(输入流,输出流);

6、response、request登录、注册案例

环境准备:

        pom.xml:

  <dependencies>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.5</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.23</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.12</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>RELEASE</version>
      <scope>compile</scope>
    </dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>RELEASE</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

        在resource下添加mybatis-config.xml配置文件------知识点包扫描mapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
<!--                mybatis的核心配置文件-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/jdbc?useSSL=false&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
<!--        包扫描mapper-->
        <package name="com.itheima.mapper"/>
    </mappers>
</configuration>

        java下新建com.itheima.pojo.Account实体类

@Data
public class Account {
    //这里不用int是因为int有初始值
    private Integer id;
    private String name;
    private Double balance;
}

登录功能

        在java下创建com.itheima.mapper.UserMapper接口

public interface UserMapper {
    @Select("select * from account where name = #{name} and balance = #{balance}")
    Account login(@Param("name") String name,@Param("balance") String balance);
}

        在java下创建com.itheima.LoginController用于登录

@WebServlet("/login")
public class LoginController extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求数据
        req.setCharacterEncoding("UTF-8");
        String name = req.getParameter("name");
        String balance = req.getParameter("balance");

        //mybatis获取数据库数据
        String resource = "mybatis-config.xml";
        InputStream resourceAsStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //2.获取SqlSession对象,用来执行sql
        SqlSession sqlSession = build.openSession();
        //3.执行sql
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Account account = mapper.login(name,balance);

        resp.setContentType("text/html;charset=utf-8");
        resp.setStatus(201);
        PrintWriter writer = resp.getWriter();
        if(account != null){
            writer.write("登录成功");
        }else{
            writer.write("登陆失败");
        }
    }
}

        前端页面代码在webapp下创建login.html

<form action="/login" method="post">
    <input type="text" name="name" placeholder="请输入账号">
    <input type="password" name="balance" placeholder="请输入密码">
    <input type="submit" value="登录">
</form>

注册功能:------一定要注意commit要提交事务否则不会更新数据库

        mapper映射文件

@Insert("insert into account values(null,#{name},#{balance})")
int register(@Param("name") String name,@Param("balance") int balance);

        RegisterController文件

@WebServlet("/register")
public class RegisterController extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求数据
        req.setCharacterEncoding("UTF-8");
        String name = req.getParameter("name");
        Integer balance = Integer.parseInt(req.getParameter("balance"));

        //mybatis获取数据库数据
        String resource = "mybatis-config.xml";
        InputStream resourceAsStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //2.获取SqlSession对象,用来执行sql
        SqlSession sqlSession = build.openSession(true);
        //3.执行sql
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int len = mapper.register(name,balance);

        resp.setContentType("text/html;charset=utf-8");
        resp.setStatus(201);
        PrintWriter writer = resp.getWriter();
        if(len != 0){
            writer.write("注册成功");
        }else{
            writer.write("注册失败");
        }
    }
}

        前端注册页面代码

<form action="/register" method="post">
    <input type="text" name="name" placeholder="请输入账号">
    <input type="password" name="balance" placeholder="请输入密码">
    <input type="submit" value="注册">
</form>

项目----文件目录展示

十一、JSP


        JSP技术已经过时,现在学习也只是为了维护老项目

1.JSP快速入门

导入坐标

<dependency>
  <groupId>javax.servlet.jsp</groupId>
  <artifactId>jsp-api</artifactId>
  <version>2.2</version>
  <scope>provided</scope>
</dependency>

创建JSP文件        编写HTML标签 和 Java代码

<body>
<h1>Hello World</h1>
<% System.out.println("jsp hello~");%>
</body>

2.JSP脚本分类

<%...%>:内容会直接放在_jspService()方法之中

<%=...%>:内容会放到out.print()中,作为out.prin()的参数

<%!...%>:内容会放到_jspService()方法之外,被类直接包含

3.案例使用JSP展示Account用户数据

        报错不用管没事~,软件问题

<%@ page import="java.util.ArrayList" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.itheima.pojo.Account" %><%
    ArrayList<Account> accounts = new ArrayList<>();
    accounts.add(new Account(1,"张三",3000.00));
    accounts.add(new Account(2,"李四",4000.00));
    accounts.add(new Account(3,"王五",4500.00));
%>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<table>
    <tr><th>ID</th><th>姓名</th><th>工资</th></tr>
    <%
        for (int i = 0 ; i < accounts.size(); i ++){
    %>
    <tr>
        <td><%= accounts.get(i).getId() %></td>
        <td><%= accounts.get(i).getName() %></td>
        <td><%= accounts.get(i).getBalance() %></td>
    </tr>
    <%
        }
    %>
</table>
</body>
</html>

4.EL表达式

语法:${expression}  获取存在setAttribute域里面的值

index.jsp代码

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page isELIgnored="false" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    ${accounts}
</body>
</html>

请求代码:注意要先访问请求页面,让他跳转到index.jsp才能有数据        localhost/demo2

@WebServlet("/demo2")
public class Demo2Controller extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ArrayList<Account> accounts = new ArrayList<>();
        accounts.add(new Account(1,"张三",3000.00));
        accounts.add(new Account(2,"李四",4000.00));
        accounts.add(new Account(3,"王五",4500.00));

        req.setAttribute("accounts",accounts);

        req.getRequestDispatcher("/index.jsp").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("POST...");
    }
}

5.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>

在JSP页面上引入JSTL标签库

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

使用

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<c:if test="true">
    <h1>我是对的时候展示</h1>
</c:if>
<c:if test="false">
    <h1>我是错的时候展示</h1>
</c:if>
</body>
</html>

上图使用setAttribute跳转,显示

@WebServlet("/demo2")
public class Demo2Controller extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("status",1);
        req.getRequestDispatcher("/index.jsp").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("POST...");
    }
}

index.jsp文件

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<c:if test="${status == 1}">
    <h1>1</h1>
</c:if>
<c:if test="${status == 0}">
    <h1>0</h1>
</c:if>
</body>
</html>

<c:forEach>:相当于for循环-----------数据依旧使用setAttribute和forward跳转传递

        items:被遍历的容器

        var:遍历产生的临时变量

<%@ page import="com.itheima.pojo.Account" %>
<%@ page import="java.util.ArrayList" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <table>
        <tr><th>ID</th><th>姓名</th><th>工资</th></tr>
        <c:forEach items="${accounts}" var="user">
            <td>${user.getId()}</td>
            <td>${user.getName()}</td>
            <td>${user.getBalance()}</td>
        </c:forEach>
    </table>
</body>
</html>

6.MVC模式

MVC是一种分层开发的模式,其中    M:Model,业务模型,处理业务   V:view,视图,界面展示     C:Controller,控制器,处理请求,调用模型和视图

优点:职责单一,互不影响,有利于分工协作,有利于组件重用 

7.三层模型

数据访问层:对数据库的SRUD基本操作

业务逻辑层:对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务逻辑功能

表现层:接收请求,封装数据,调用业务逻辑层,响应数据

8.案例----Account增删改查 步骤

创建新的模块,引入坐标

        mybatis        mysql        servlet        jsp        坐标

创建三层架构的包结构 web         service     pojo        dao        mapper

创建数据库表、创建实体类   Account

MyBatis基础环境:mybatis-config.xml        BrandMapper.xml        BrandMapper接口

十二、会话跟踪技术


        多次请求之间共享数据

1.客户端会话跟踪技术:Cookie

cookie基本使用:将数据保存在客户端,以后每次请求都携带Cookie数据进行访问

        创建Cookie对象,设置数据:Cookie cookie  =  new Cookie("key","value");

        发送Cookie客户端:使用response对象:response.addCookie(cookie);

        获取客户端携带的所有Cookie,使用request对象:Cookie[] cookies = request.getCookies();

        遍历数组,获取每一个Cookie对象:for

        使用Cookie对象方法获取数据:cookie.getName();        cookie.getValue();

使用细节

        cookie设置存活时间  setMaxAge(int seconds):正数,到时间销毁。负数:浏览器关闭就删除。零:删除对应Cookie

2.服务端会话跟踪技术:Session

将数据保存到服务端

        获取Session对象 HttpSession session = request.getSession();

        void setAttribute(String name,Object o):存储数据到session域中

        Object getAttribute(String name):根据key,获取值

        void removeAttribute(String name):根据key,删除键值对

使用细节

        默认情况下,无操作,30分钟自动销毁。在webapp下的web.xml中配置

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

        调用Session对象的invalidate()方法销毁

十三、Filter


概念:Filter表示过滤器,是JavaWeb三大组件(Servlet,Filter,Listener)之一、

过滤器可以把资源的请求拦截下来,从而实现一些特殊的功能。

过滤器一般完成一些通用的操作,比如:权限控制、统一编码处理,敏感字符处理等等...

1.filter快速入门

定义类,实现Filter接口,并重写其所有方法

public class FilerDemo implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    }

    @Override
    public void destroy() {

    }
}

配置Filter拦击资源的路径:在类上定义@WebFilter注解

@WebFilter("/*")
public class FilerDemo implements Filter {

在doFilter房中输出一句话并放行

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
      System.out.println("hello filter");
      filterChain.doFilter(servletRequest,servletResponse);
}

2.Filter访问路径

@WebFilter("/*")

        拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截。

        目录拦截:/user/*:访问/usr下的所有资源,都会被拦截

        后缀名拦截:*.jsp:访问后缀名为jsp的资源都会被拦截

        拦截所有:/*:访问所有资源,都会被拦截

十四、Listener(不常用了)


JavaWeb撒表达组件之一

基本使用:继承ServletConextListener再加上@WebListener注解。里面的contextInitalized方法负责加载资源。contextDestroyed方法释放资源

十五、AJAX-AXIOS


异步的Javascript        和        XML        前端技术略过

十六、JSON


1.数据格式

var user = {name:"张三",age:18}

2.Java对象转换为JSON格式

Fastjson是阿里巴巴提供的一个Java语言编写的高性能功能完善的JSON库,是目前Java语言中最快的JSON库,可以实现Java对象和JSON对象相互转换

导入坐标

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.76</version>
</dependency>

Java对象转JSON:String jsonStr = JSON.toJSONString(obj)

JSON字符串转Java对象:User user = JSON.parseObject(jsonStr,User.class);

3.案例

直接总结知识点:返回数据使用

resp.getWriter().write(JSON.toJSONString(accounts));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/144322.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PCB设计如何防止阻焊漏开窗

PCB的阻焊层&#xff08;solder mask&#xff09;&#xff0c;是指印刷电路板子上要上绿油的部分。阻焊开窗的位置是不上油墨的&#xff0c;露出来的铜做表面处理后焊接元器件的位置&#xff0c;不开窗的位置都是印上油墨的防止线路氧化、漏电。 PCB阻焊层开窗的三个原因 1.孔…

【架构设计】如何让你的应用做到高内聚、低耦合?

前言 最近review公司的代码&#xff0c;发现代码耦合程度特别高&#xff0c;修改一处&#xff0c;不知不觉就把其他地方影响到了&#xff0c;这就让我思考该如何让我们写的代码足够内聚&#xff0c;减少耦合呢&#xff1f; "高内聚、松耦合"是一个非常重要的设计思…

Idea插件之日志管理神器(Grep Console)

1.简介Grep Console是一款方便开发者对idea控制台输出日志进行个性化管理的插件。2.功能特性Grep Console的主要功能特性&#xff1a;支持自定义规则来过滤日志信息&#xff1b;支持不同级别的日志的输出样式的个性化配置&#xff1b;总结&#xff1a;通过过滤功能、输出日志样…

经典卷积神经网络-AlexNet

AlexNet 学习目标 知道AlexNet网络结构能够利用AlexNet完成图像分类2012年&#xff0c;AlexNet横空出世&#xff0c;该模型的名字源于论文第一作者的姓名Alex Krizhevsky 。AlexNet使用了8层卷积神经网络&#xff0c;以很大的优势赢得了ImageNet 2012图像识别挑战赛。它首次证…

为何瑞达利欧的《原则一》这么难读懂?

开始搞不懂&#xff0c;为何一个桥水基金创始人&#xff0c;一位投资人&#xff0c;却写了一本这样的书&#xff0c;书中的内容初看时觉得与他从事的投资事业几乎毫无关系&#xff1f; 《原则》其副标题为《生活和工作的原则》 乍看&#xff0c;此书黑色的封皮&#xff0c;让我…

【自学C++】C++ std命名空间

C std命名空间 C std命名空间教程 在 C 中 std 命名空间 是 C 中标准库类型对象的命名空间。我们常用的输入和输出 函数 都是定义在 std 命名空间中的&#xff0c;因此&#xff0c;我们需要使用输入和输出&#xff0c;必须要引入 std 命名空间。 要引用一个命名空间中的内容…

电脑自动删除文件怎么恢复?分享4种方法

电脑出现文件丢失的情况常有发生&#xff0c;但是出现电脑自动删除文件的情况是怎么回事呢&#xff1f;电脑自动删除的文件怎么恢复呢&#xff1f;本文将详细阐述电脑自动删除文件原因和文件恢复方法。一、电脑自动删除文件是什么原因1.可能不是删除而是电脑开机用户名更改后导…

Java真的不难(五十三)Docker的快速入门及使用

Docker的入门及使用 这篇文章将不全面介绍理论&#xff0c;Docker对于我们后端开发来说会用就行&#xff0c;能使用Docker去安装一些镜像运行&#xff0c;为简化配置节省时间和错误率&#xff0c;所以这篇文章实用性很高&#xff0c;可以直接上手&#xff01; 一、什么是Docke…

生产制造业ERP管理系统财务管理解决方案

对于生产制造型企业来说&#xff0c;良好的资金运营管理机制是企业长期、稳定、健康发展的保证。因此&#xff0c;企业急需借助生产制造业ERP管理系统&#xff0c;不断加强企业财务管理&#xff0c;从而有效提升企业的经营效率&#xff0c;降低财务风险&#xff0c;缓解资金成本…

云渲染答疑:动画渲染价格一般多少?

云渲染是什么&#xff1f;云渲染就是通过互联网将用户本地需要渲染的文件上传到云端服务器中&#xff0c;再通过云端庞大的计算机集群资源进行运算操作&#xff0c;帮助用户在云端完成渲染工作后&#xff0c;用户再下载到本地的过程&#xff0c;整个过程操作十分简便。云渲染动…

【云原生进阶之容器】第二章Controller Manager原理2.5节--DeltaFIFO剖析

5 DeltaFIFO DeltaFIFO是K8s中用来存储处理数据的Queue,相较于传统的FIFO,它不仅仅存储了数据保证了先进先出,而且存储有K8s 资源对象的类型,它的作用是保证Reflector和Indexer之间对象同步。其是连接Reflector(生产者)和indexer(消费者)的重要通道。其核心处理流程如下: …

android 换肤框架搭建及使用 (3 完结篇)

本系列计划3篇: Android 换肤之资源(Resources)加载(一)setContentView() / LayoutInflater源码分析(二)换肤框架搭建(三) — 本篇 tips: 本篇只说实现思路,以及使用,具体细节请下载代码查看! 本篇实现效果: fragment换肤recyclerView换肤自定义view属性换肤打开打开打开动…

解决第三方图片403问题

第三方平台怎么处理图片资源保护的? 服务端一般使用 Referer 请求头识别访问来源&#xff0c;然后处理资源访问。 Referer 是什么东西? 扩展参考: http://www.ruanyifeng.com/blog/2019/06/http-referer.html Referer是 HTTP 请求头的一部分&#xff0c;当浏览器向 Web 服务…

HTML实现舔狗日记

演示 css html, body {background: radial-gradient(#181818, #000000);margin: 0;padding: 0;border: 0;-ms-overflow-style: none;}::-webkit-scrollbar {width: 0.5em;height: 0.5em;background-color: #c7c7c7;}/*定义滚动条轨道 内阴影圆角*/::-webkit-scrollbar-track {…

不会写代码?也不懂技术?3分钟搭建电商cps系统搞副业

大家好&#xff0c;我是小悟 唠唠家常 以前见面聊天&#xff0c;大家都习惯性会问“你吃饭了吗”&#xff0c;现在大家一出口就是“你阳了吗”。2023年元旦过去了&#xff0c;你还阳着么&#xff1f;不出意外的话就会出意外&#xff0c;小悟也已经中招过了&#xff0c;在家躺…

【Linux】tcpdump命令详解

1、列出本机所有的网卡接口 tcpdump -D2、捕获特定网口的数据包 tcpdump -i bond0.1083、捕获具体数量的数据包 tcpdump -c 5 -i eth04、捕获的数据包保存到指定的文件 tcpdump -w 0001.pcap -i eth05、捕获的数据包显示IP而不

E4402B频谱分析仪

18320918653 E4402B E4402B|Agilent|3G|频谱分析仪|安捷伦|9kHz至3GHz 品牌&#xff1a;安捷伦 Agilent 惠普 HP 测量速度&#xff1a;28次更新/秒 测量精度&#xff1a;1dB 可选用的10Hz分辨事宽滤波器 机箱可容纳6插槽选件卡 97dB三阶动态范围 能在现场使用的坚固&a…

(1分钟速览)SLAM问题中一般方程和超定方程的求解

今天在学习的过程中偶然看到了一个博客&#xff0c;总结Axb的&#xff0c;那么我也写一篇。首先就是判断A的秩和(A|b)的秩之间的关系&#xff0c;然后通过这个关系来进行进一步地判断。编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;求解方…

RabbitMQ通配符模式

&#x1f341;博客主页&#xff1a;&#x1f449;不会压弯的小飞侠 ✨欢迎关注&#xff1a;&#x1f449;点赞&#x1f44d;收藏⭐留言✒ ✨系列专栏&#xff1a;&#x1f449;Linux专栏 &#x1f525;欢迎大佬指正&#xff0c;一起学习&#xff01;一起加油&#xff01; 目录&…

Jenkins安装方式之war包及相关环境配置

持续创作&#xff0c;加速成长&#xff01;这是我参与「掘金日新计划 10 月更文挑战」的第4天&#xff0c;点击查看活动详情 最近总有小伙伴发私信问我jenkins如何以war形式运行&#xff1f;以及运行后如何添加相关的环境配置&#xff0c;这里我就给大家贴出我的解决方案&…