这里写自定义目录标题
最后的效果
开发前准备
1、eclipse
2、jdk1.8
3、tomcat 9.0
4、mysql
5、一些java包
准备数据库
开始编写代码
1、在eclipse里面new一个Dynamic Web Project(创建时记得勾选添加web.xml)
2、编写web.xml
在web里面添加以下代码
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3、WEB-INF添加springmvc-servlet.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd ">
<!-- 自动生成com.controlle、com.service、com.dao里面注解的bean -->
<context:component-scan base-package="com.controller" />
<context:component-scan base-package="com.service" />
<context:component-scan base-package="com.dao" />
<!-- UserController.java 里面的 @RequestParam("goods") GoodsModel gm就会调用下面的转换 string转GoodsModel就刚好对应着GoodsConverter 里面的Converter<String, GoodsModel> -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.formatter.GoodsConverter"/>
</list>
</property>
</bean>
<mvc:annotation-driven conversion-service="conversionService"/>
<!-- 该bean是配置http访问的网址形式 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
4、在src中创建以下包和bean工程application.xml
5、编写com.pojo里面的内容(该包是和数据库相对应)
User对应数据库的table user;GoodsModel对应着数据库的table GoodsModel;user_supplement是补充填写table user表里面的hobby 和 friends字段的,因为在user.java中,这两个字段是字符串数组,而在mysql中是字符串,所以需要转换下格式。
编写user.java
package com.pojo;
import java.util.Arrays;
public class User {
private String userName;
private String[] hobby;
private String[] friends;
private String carrer;
private String houseRegister;
private String remark;
private GoodsModel userData;
}
以下的pojo文件都省了set和get方法。
编写其他两个class
package com.pojo;
public class GoodsModel {
private String goodsname;
private double goodsprice;
private int goodsnumber;
}
package com.pojo;
public class user_supplement {
private String userName;
private String supplement;
}
编写Dao层
pojo层负责对应数据库,Dao层负责联络数据库,给数据库做一些动作,接着编写Dao层
goodsDao负责提供操作数据库goodsModel的接口
UserDao负责提供操作数据库User的接口
package com.dao;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import com.pojo.User;
//自动生成bean的注解
@Repository("goodsDao")
//该注解通过application里面的扫描,然后连接到com.mybatis里面的UserMapper.xml文件
@Mapper
public interface goodsDao {
public int addgoods(User user);
}
package com.dao;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import com.pojo.*;
//自动生成bean的注解
@Repository("userDao")
//该注解通过application里面的扫描,然后连接到com.mybatis里面的goodsMapper.xml文件
@Mapper
public interface UserDao {
public int addUser(User user);
public int updateUser_hobby(user_supplement sup);
public int updateUser_friends(user_supplement sup);
}
编写service层
service层是DAO层的上一层,可以调用DAO层里面的方法。
接着编写上面的.java文件
package com.service;
import java.util.ArrayList;
import com.pojo.User;
public interface UserService {
boolean addUser(User u);
ArrayList<User> getUsers();
}
package com.service;
import java.util.ArrayList;
import org.springframework.stereotype.Service;
import com.pojo.User;
//自动生成bean的注解
@Service
public class UserServiceImpl implements UserService {
private static ArrayList<User> users=new ArrayList<User> ();
@Override
public boolean addUser(User u) {
// TODO Auto-generated method stub
users.add(u);
return true;
}
@Override
public ArrayList<User> getUsers() {
// TODO Auto-generated method stub
return users;
}
}
接着搭配bean工厂和数据库xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 自动生成com.dao里面注解的bean -->
<context:component-scan base-package="com.dao" />
<!-- 配置数据库 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name= "driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/springtest?serverTimezone=America/New_York"/>
<property name = "username" value="root"/>
<property name= "password" value ="1234567" />
</bean>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:annotation-driven transaction-manager="txManager" />
<!-- 使数据库连接数据库语句 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:com/mybatis/mybatis-config.xml" />
</bean>
<!-- 使dao层数据库语句 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.dao"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
</beans>
下面搭建数据库语句的xml
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>
<mappers>
<mapper resource="com/mybatis/UserMapper.xml"/>
<mapper resource="com/mybatis/goodsMapper.xml"/>
</mappers>
</configuration>
UserMapper.xml负责User表的语句
<?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.dao.UserDao">
<insert id="addUser" parameterType="com.pojo.User">
insert into user (userName,hobby,friends,carrer,houseRegister,remark) values (#{userName},null,null,#{carrer},#{houseRegister},#{remark})
ON DUPLICATE KEY UPDATE userName=#{userName}
</insert>
<update id="updateUser_hobby" parameterType="com.pojo.user_supplement">
update user set hobby=#{supplement} where userName=#{userName}
</update>
<update id="updateUser_friends" parameterType="com.pojo.user_supplement">
update user set friends=#{supplement} where userName=#{userName}
</update>
</mapper>
goodsMapper.xml负责goodsmodel表的语句
<?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.dao.goodsDao">
<insert id="addgoods" parameterType="com.pojo.User">
insert into goodsmodel (goods_userName,goodsname,goodsprice,goodsnumber)
select #{userName},#{userData.goodsname},#{userData.goodsprice},#{userData.goodsnumber}
where exists (select * from springtest.user where userName =#{userName} );
</insert>
</mapper>
编写controller层
controller是service层的上一层,负责调用service的方法,接收http的访问,调用bean工厂等等的功能,bean工厂可以链接数据库和调用mapper.xml那么xml文件。
package com.controller;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.dao.UserDao;
import com.dao.goodsDao;
import com.pojo.GoodsModel;
import com.pojo.User;
import com.pojo.user_supplement;
import com.service.UserService;
@Controller
@RequestMapping("/user")
public class UserController {
//加载bean工厂
ApplicationContext appCon=new ClassPathXmlApplicationContext("applicationContext.xml");
private UserDao userDao=(UserDao) appCon.getBean("userDao");
private goodsDao goodsDao=(goodsDao) appCon.getBean("goodsDao");
//开启日记
private static final Log logger =(Log) LogFactory.getLog(UserController.class);
//创建一个user_supplement 类型,该类型实现字符串数组变为字符串
private user_supplement sup=new user_supplement();
@Autowired
private UserService userService;
@RequestMapping(value="/input")
public String inputUser(Model model) {
HashMap<String,String> hobbys=new HashMap<String ,String>();
hobbys.put("篮球","篮球");
hobbys.put("唱","唱");
hobbys.put("跳","跳");
hobbys.put("rap","rap");
model.addAttribute("user", new User());
model.addAttribute("hobbys", hobbys);
model.addAttribute("carrers", new String[] {"教师","学生","coding搬运工","IT民工","其他"});
model.addAttribute("houseRegisters", new String[] {"北京","上海","广州","深圳","其他"});
//return 会在浏览器显示userAdd.jsp
return "userAdd";
}
@RequestMapping(value="/list")
public String listUsers(@ModelAttribute User user,@RequestParam("goods") GoodsModel gm, Model model) {
user.setUserData(gm);
userService.addUser(user);
userDao.addUser(user);
sup.setUserName(user.getUserName());
sup.setSupplement(Arrays.toString(user.getHobby()));
userDao.updateUser_hobby(sup);
sup.setSupplement(Arrays.toString(user.getFriends()));
userDao.updateUser_friends(sup);
goodsDao.addgoods(user);
List<User> users=userService.getUsers();
model.addAttribute("users", users);
model.addAttribute("goods", gm);
return "userList";
}
}
编写formatter层
该层可以接应UserController Class 里面的@RequestParam(“goods”) GoodsModel gm ,使表现层传回来的字符串goods转换为GoodsModel类型
package com.formatter;
import org.springframework.core.convert.converter.Converter;
import com.pojo.GoodsModel;
public class GoodsConverter implements Converter<String, GoodsModel> {
@Override
public GoodsModel convert(String source) {
// TODO Auto-generated method stub
String s[]=source.split(",");
GoodsModel goods=new GoodsModel();
goods.setGoodsname(s[0]);
goods.setGoodsprice(Double.parseDouble(s[1]));
goods.setGoodsnumber(Integer.parseInt(s[2]));
return goods;
}
}
最后编写表现层,在浏览器上展示
在WEB-INF中创建一个jsp包
userAdd负责让客户输入相关数据
userList负责显示出客户已经输入的数据
userAdd.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form:form modelAttribute="user" method="post" action=" ${pageContext.request.contextPath }/user/list">
<fieldset>
<legend>添加一个用户</legend>
<p>
<label>用户名:</label>
<form:input path="userName"/>
</p>
<p>
<label>爱好:</label>
<form:checkboxes items="${hobbys }" path="hobby"/>
</p>
<p>
<label>朋友:</label>
<form:checkbox path="friends" value="张三"/>张三
<form:checkbox path="friends" value="李四"/>李四
<form:checkbox path="friends" value="王五"/>王五
<form:checkbox path="friends" value="赵六"/>赵六
</p>
<p>
<label>职业:</label>
<form:select path="carrer">
<option/>请选择职业
<form:options items="${carrers }"/>
</form:select>
</p>
<p>
<label>户籍:</label>
<form:select path="houseRegister">
<option/>请选择户籍
<form:options items="${houseRegisters }"/>
</form:select>
</p>
<p>
<label>个人描述:</label>
<form:textarea path="remark" row="5"/>
</p>
goods:<input type="text" name="goods"/>(一定要输入apple,10.58,200)这样的格式 <br>
<p id="buttons">
<input id="reset" type="reset">
<input id="submit" type="submit" value="添加">
</p>
</fieldset>
</form:form>
</body>
</html>
userList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>用户列表</h1>
<a href="${pageContext.request.contextPath }/user/input">继续添加</a>
<table>
<tr>
<th>用户名</th>
<th>兴趣爱好</th>
<th>朋友</th>
<th>职业</th>
<th>户籍</th>
<th>个人描述</th>
<th>goods</th>
</tr>
<c:forEach items="${users }" var="user">
<tr>
<td>${user.userName }</td>>
<td>
<c:forEach items="${user.hobby }" var="hobby">
${hobby }
</c:forEach>
</td>
<td>
<c:forEach items="${user.friends }" var="friend">
${friend }
</c:forEach>
</td>
<td>
${user.carrer }
</td>
<td>
${user.houseRegister }
</td>
<td>
${user.remark }
</td>
<td>
${user.userData.goodsname }  ${user.userData.goodsprice }  ${user.userData.goodsnumber }
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
最后运行MVC项目
右击mybatisMVC_third
在Run As 里面点击Run on server,选择tomcat 9.0 然后点击finish
等待项目启动成功
在浏览器输入地址
http://localhost:8080/mybatisMVC_third/user/input
下图就为整个小项目的效果了