javaweb快速入门

使用maven、mybatis、servlet、tomcat、axois、html/css/javascript、vue、element快速构建javaweb项目

完整项目

  1. 首先创建项目

  2. 并整理项目结构
    在这里插入图片描述

  3. 配置pom.xml文件
    添加jar包标签和tomcat标签

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>brand-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>war</packaging>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>


    <dependencies>
        <!-- fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>

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

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>

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

        <!--jsp-->

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

        <!--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>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
            </plugin>
        </plugins>
    </build>


</project>

开始写servlet

前后端实现数据分离依靠很多servelet
在对应package下创建servelet,如下:

@WebServlet("/selectServlet")  //该servlet访问路径
public class SelectServlet extends HttpServlet {
    private BrandService brandService = new BrandService();

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("get");
        List<Brand> brands = brandService.selectAll();

        String jsonString = JSON.toJSONString(brands);

        response.setContentType("text/json;charset=utf-8");
        response.getWriter().write(jsonString);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("post");
    }
}

在浏览器请求该servlet的路径即为:

http://localhost:8080/brand-demo/brand/selectServlet

这样浏览器就可以和服务器进行数据交换了,我们可以在前端页面中使用axios请求这个地址

配置mybatis及mapper

使用mybatis访问数据库

我们可以在每个项目重复性的写一些文件和代码,只需修改数据库地址和账号密码即可,步骤如下:

  1. 配置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>
    <!--起别名-->
    <typeAliases>
        <package name="com.itheima.pojo"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false"/>
                <!-- 这里的localhost可改为云数据库的ip,注意端口号 -->
                <property name="username" value="root"/>
                <property name="password" value="####"/>
                <!-- 账户及密码 -->
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--扫描mapper 这个地址为BrandMapper.xml文件所在package的引用地址-->
        <package name="com.itheima.mapper"/>
    </mappers>
</configuration>
  1. 配置BrandMapper.xml文件
<?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">
<mapper namespace="com.itheima.mapper.BrandMapper">
<!--  命名空间映射到mapper接口  -->
</mapper>

接下来开始写代理SQL

  1. 首先要创建我们需的数据类,便于我们封装数据
    如:Brand类
    在这里插入图片描述

  2. 创建mapper接口文件brandMapper
    在这个文件写所有mapper接口,并用注解的方式直接写SQL语句:

public interface BrandMapper {

    /**
     * 查询所有
     * @return
     */
    @Select("select * from tb_brand") //用注解的方式写sql更清楚
    @ResultMap("brandResultMap")  //因为数据库中的属性名与Brand的属性名有两个不一样,需要在BrandMapper.xml文件中 进行映射,"brandResultMap"即为映射的id
    List<Brand> selectAll(); //返回Brand列表

    @Insert("insert into tb_brand values(null,#{brandName},#{companyName},#{ordered},#{description},#{status})")
    void add(Brand brand); //只有一个参数Brand,直接在sql中使用其属性即可

    /**
     * 根据id查询
     * @param id
     * @return
     */
    @Select("select * from tb_brand where id = #{id}")
    @ResultMap("brandResultMap")
    Brand selectById(int id);

    /**
     * 修改
     * @param brand
     */
    @Update("update tb_brand set brand_name = #{brandName},company_name = #{companyName},ordered = #{ordered},description = #{description},status = #{status} where id = #{id}")
    void update(Brand brand);

}

注意当接口有多个参数时,需要生命参数是对应sql语句中的哪个值,下面的"username"和"password":

User select(@Param("username") String username,@Param("password") String password);
  1. 因为刚才使用到了resultMap,所以需要在BrandMapper.xml中添加标签:
<?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">
<mapper namespace="com.itheima.mapper.BrandMapper">
<!--  命名空间映射到mapper接口  -->



    <resultMap id="brandResultMap" type="brand">
        <result column="brand_name" property="brandName"></result>
        <result column="company_name" property="companyName"></result>
    </resultMap>
</mapper>

将column转为property
注意BrandMapper.xml所在的包要与接口文件的包层级结构相同!在resource目录下创建多级包是用/分层:
在这里插入图片描述

编码

  1. 创建一个工具类,
    util.SqlSessionFactoryUtils.java
package com.itheima.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class SqlSessionFactoryUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        //静态代码块会随着类的加载而自动执行,且只执行一次

        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static SqlSessionFactory getSqlSessionFactory(){
        return sqlSessionFactory;
    }
}

这样我们以后在需要mapper时,只需要利用创建好的SqlSessionFactory获取SqlSession,在从SqlSession中获取mapper即可

这里我们创建一个service.BrandService.java类,将对数据库的不同操作都封装在这个类中:

package com.itheima.service;

import com.itheima.mapper.BrandMapper;
import com.itheima.pojo.Brand;
import com.itheima.util.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.util.List;

public class BrandService {
    SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();


    /**
     * 查询所有
     * @return
     */
    public List<Brand> selectAll(){
        //调用BrandMapper.selectAll()

        //2. 获取SqlSession
        SqlSession sqlSession = factory.openSession();
        //3. 获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

        //4. 调用方法
        List<Brand> brands = mapper.selectAll();

        sqlSession.close();

        return brands;
    }

    /**
     * 添加
     * @param brand
     */
    public void add(Brand brand){

        //2. 获取SqlSession
        SqlSession sqlSession = factory.openSession();
        //3. 获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

        //4. 调用方法
        mapper.add(brand);

        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();

    }



    /**
     * 根据id查询
     * @return
     */
    public Brand selectById(int id){
        //调用BrandMapper.selectAll()

        //2. 获取SqlSession
        SqlSession sqlSession = factory.openSession();
        //3. 获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

        //4. 调用方法
        Brand brand = mapper.selectById(id);

        sqlSession.close();

        return brand;
    }


    /**
     * 修改
     * @param brand
     */
    public void update(Brand brand){

        //2. 获取SqlSession
        SqlSession sqlSession = factory.openSession();
        //3. 获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

        //4. 调用方法
        mapper.update(brand);

        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();

    }
}

接下来就可以在servlet中new一个BrandService对象,从而进行数据库操作了。

JSON

JSON和JAVA对象转换
导入标签

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.62</version>
</dependency>

java对象转JSON

String jsonStr = JSON.toJSONString(obj);

JSON字符串转Java对象

User user = JSON.parseObject(jsonStr, User.class);

使用json作为响应数据:

//在servlet中
String jsonString = JSON.toJSONString(brands);

        response.setContentType("text/json;charset=utf-8");
        response.getWriter().write(jsonString);

服务端接收JOSON数据

//获取请求数据体
BufferedReader br = request.getReader();
String params = br.readLine();

//将JSON字符串转为JAVA对象
Brand brand = JSON.parseObject(params, Brand.class);
System.out.println(brand);

Axois

官方文档

在webapp文件夹下导入其依赖文件
在使用时导入该包:

<script src="js/axios-0.18.0.js"></script>

使用简化后的函数请求数据

axios({
        method:"get",
        url:"http://localhost:8080/AjaxDemo/axiosServlet?username=zhangsan"
    }).then(function (resp){
        alert(resp.data)
    })
//发起一个get请求

axios({
        method: 'post',
        url: 'http://localhost:8080/AjaxDemo/axiosServlet',
        data: 'username=zhangsan'
    }).then(function (resp){
        alert(resp.data)
    })
//发起一个get请求

首次加载数据实在页面加载完成后进行,结构如下:

window.onload = function(){
    axios({
        method:"get",
        url:""
    }).then(function (resp){
        
    })
}

页面如何渲染axois返回的数据:

axios({
            method: "get",
            url: "http://localhost:8080/brand-demo/selectServlet"
        }).then(function (resp) {
            let brands = resp.data;
            let tabledata = "<tr>\n" +
                "        <th>序号</th>\n" +
                "        <th>品牌名称</th>\n" +
                "        <th>企业名称</th>\n" +
                "        <th>排序</th>\n" +
                "        <th>品牌介绍</th>\n" +
                "        <th>状态</th>\n" +
                "        <th>操作</th>\n" +
                "    </tr>";

            for (let i = 0; i < brands.length; i++) {
                let brand = brands[i];

                tabledata += "<tr>\n" +
                    "        <th>"+String(i+1)+"</th>\n" +
                    "        <th>"+brand.brandName+"</th>\n" +
                    "        <th>"+brand.companyName+"</th>\n" +
                    "        <th>"+brand.description+"</th>\n" +
                    "        <th>"+brand.id+"</th>\n" +
                    "        <th>"+brand.order+"</th>\n" +
                    "        <th>"+brand.status+"</th>\n" +
                    "    </tr>";
            } //将数据插入到html文本中
            document.getElementById("brandTable").innerHTML = tabledata; //再将html文本引用在对应的容器中
        })

Vue

前端框架,可以实现数据模型的绑定
首先引入vue.js

   <script src="js/vue.js"></script>

创建核心Vue对象

   new Vue({
       el: "#app",
       data() {
           return {
               username: ""
           }
       }
   });

编写视图

<div id="app">
    <input name="username" v-model="username" >
    {{username}}
</div>

{{}} 是 Vue 中定义的 插值表达式 ,在里面写数据模型,到时候会将该模型的数据值展示在这个位置。

整体代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
    <input v-model="username">
    <!--插值表达式-->
    {{username}}
</div>
<script src="js/vue.js"></script>
<script>
    //1. 创建Vue核心对象
    new Vue({
        el:"#app",
        data(){  // data() 是 ECMAScript 6 版本的新的写法
            return {
                username:""
            }
        }

        /*data: function () {
            return {
                username:""
            }
        }*/
    });

</script>
</body>
</html>

Element UI

同样引入

<script src="element-ui/lib/index.js"></script>
<link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css">

参照官方文档使用所需组件的代码即可,注意粘贴代码时,要将style、html、vue的data和method分开复制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小龙凤团茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值