使用maven、mybatis、servlet、tomcat、axois、html/css/javascript、vue、element快速构建javaweb项目
完整项目
-
首先创建项目
-
并整理项目结构
-
配置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访问数据库
我们可以在每个项目重复性的写一些文件和代码,只需修改数据库地址和账号密码即可,步骤如下:
- 配置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>
- 配置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
-
首先要创建我们需的数据类,便于我们封装数据
如:Brand类
-
创建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);
- 因为刚才使用到了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目录下创建多级包是用/分层:
编码
- 创建一个工具类,
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分开复制