JavaWeb学习——SSM框架实现登陆、注册与增删查改
- 1.各项配置
- 1. 依赖配置(pom.xml)
- 2. web配置(web.xml)
- 3. Spring配置(applicationContext.xml)
- 4. SpringMV配置(spring-mvc.xml)
- 5. Mybatis配置
- 核心文件
- 实现接口配置(sql语句)
- 2.视图层
- 1. 登陆视图层
- 2. 操作视图层
- 3.web层
- 4.service层
- 1.service接口
- 2.service接口实现
- 5.mapper层
1.各项配置
1. 依赖配置(pom.xml)
<dependencies>
<!--单元测试jar包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!--Servlet依赖jar包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--mysql驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
<scope>runtime</scope>
</dependency>
<!--mybatis坐标-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>
<!--druid连接池jar包-->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<!--jsoup依赖jar包-->
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.2</version>
</dependency>
<!--JSON解析器依赖jar包-->
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
<!--jstl依赖jar包-->
<!-- https://mvnrepository.com/artifact/jstl/jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--BeanUntils依赖jar包-->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
<!--SpringMVC坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.10.RELEASE</version>
</dependency>
<!--spring依赖jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.10.RELEASE</version>
</dependency>
<!--JDBCTemplate依赖jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.10.RELEASE</version>
</dependency>
</dependencies>
2. web配置(web.xml)
<!--spring 监听器-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置全局过滤器,设置编码,避免请求数据乱码-->
<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>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--配置SpringMVC的核心控制器-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--服务器启动时加载-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--映射地址-->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3. Spring配置(applicationContext.xml)
<context:component-scan base-package="com.Rendan">
<!--排除web层(SpringMVC管理)-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--加载druid.properties-->
<context:property-placeholder location="classpath:druid.properties"/>
<!--配置数据库连接池-->
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${druid.url}"></property>
<property name="username" value="${druid.username}"></property>
<property name="password" value="${druid.password}"></property>
<property name="driverClassName" value="${druid.driverClassName}"></property>
<property name="initialSize" value="${druid.initialSize}"></property>
<property name="maxActive" value="${druid.maxActive}"></property>
<property name="maxWait" value="${druid.maxWait}"></property>
</bean>
<!--配置sessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="druidDataSource"></property>
<!--加载mybatis核心配置文件-->
<property name="configLocation" value="classpath:sqlMapConfig.xml"></property>
</bean>
<!--扫描mapper所在的包 为mapper创建实现类-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.Rendan.mapper"></property>
</bean>
4. SpringMV配置(spring-mvc.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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--mvc注解驱动,代替自己配置处理器映射器-->
<mvc:annotation-driven/>
<!--扫描controller包下注解-->
<context:component-scan base-package="com.Rendan.web"/>
<!--mvc找不到后交给原始容器Tomcat找(开放静态资源访问权限)-->
<mvc:default-servlet-handler/>
</beans>
5. Mybatis配置
核心文件
<?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.Rendan.domain"/>
</typeAliases>
</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">
<mapper namespace="com.Rendan.mapper.MangerMapper">
<select id="findAll" resultType="user">
select *
from user
</select>
<select id="manger_login" parameterType="manger" resultType="manger">
select *
from manger
where mangerName = #{mangerName}
and password = #{password}
</select>
<insert id="addUser" parameterType="user">
insert into user
values (null, #{userName}, #{gender}, #{age}, #{tel}, #{password})
</insert>
<select id="findAllFood" resultType="food">
select *
from food
</select>
<insert id="addFood" parameterType="food">
insert into food
values (null, #{foodName}, #{foodDescription}, #{price}, #{unit})
</insert>
<select id="findFoodById" parameterType="int" resultType="food">
select *
from food
where id = #{id}
</select>
<update id="updateFood" parameterType="food">
update food
set foodName = #{foodName},
foodDescription = #{foodDescription},
price = #{price},
unit = #{unit}
where id = #{id}
</update>
<delete id="deleteFoodById" parameterType="int">
delete
from food
where id = #{id}
</delete>
<select id="findFoodsById" parameterType="int" resultType="food">
select *
from user_food uf,
food f
where uf.foodId = f.id
and uf.userId = #{id}
</select>
</mapper>
2.视图层
1. 登陆视图层
<body>
<%--动态获取虚拟目录--%>
<form action="${pageContext.request.contextPath}/manger/login" method="post">
<div class="wapper">
<img class="logo" src="../images/logo-main.jpg">
<h2>你好管理员!</h2>
<div class="a">
<span>用户名:</span>
<input class="user" type="text" placeholder="请输入用户名" name="mangerName"><br>
</div>
<div class="b">
<span>密 码:</span>
<input class="user" type="password" placeholder="请输入密码" name="password"><br>
</div>
<input class="three" type="submit" value="登 录">
<div class="focus">
<%--el获取域中数据--%>
<%--验证码--%>
${requestScope.cc_error}
<%--用户名与密码--%>
${requestScope.longin_error}
<%--登录过滤器--%>
${requestScope.login_msg}
</div>
</div>
<%
//获取所有Cookie
Cookie[] cookies = request.getCookies();
boolean flag = false;//没有cookie为lastTime
if (cookies != null && cookies.length > 0) {
for (Cookie cookie : cookies) {
//获取cookie名称
String name = cookie.getName();
if ("lastTime".equals(name)) {
flag = true;
//有该cookie,不是第一次访问
//响应数据
//获取cookie的value实际时间
String time = cookie.getValue();
//URL解码
time = URLDecoder.decode(time, "utf-8");
%>
<div class="time">
<span>欢迎回来,您上次访问的时间为: <%= time%> </span>
</div>
<%
//设置cookie的value
//获取当前时间字符,重新设置Cookie,重新发送Cookie
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = sdf.format(date);
//URL编码解决特殊字符无法识别
str_date = URLEncoder.encode(str_date, "utf-8");
cookie.setValue(str_date);
//设置cookie存活时间
cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
response.addCookie(cookie);
break;
}
}
}
if (cookies == null || cookies.length == 0 || flag == false) {
//没有 第一次访问
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = sdf.format(date);
//URL编码解决特殊字符无法识别
str_date = URLEncoder.encode(str_date, "utf-8");
Cookie cookie = new Cookie("lastTime", str_date);
//设置cookie存活时间
cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
response.addCookie(cookie);
%>
<div class="time">
<span>您好,欢迎首次访问!!!</span>
</div>
<%
}
%>
</form>
2. 操作视图层
<script>
function deleteUser(userId) {
//用户安全提示
if (confirm("您当真要删除?")){
//访问路径执行删除
location.href="${pageContext.request.contextPath}/deleteUser/"+userId;
}
}
</script>
</head>
<body>
<div class="wapper">
<h2>用户信息列表</h2>
<table border="1" class="a">
<tr class="a1">
<th>id</th>
<th>用户名</th>
<th>性别</th>
<th>年龄</th>
<th>电话号</th>
<th>密码</th>
<th>订单</th>
<th>操作</th>
</tr>
<%--jstl简化java书写遍历--%>
<c:forEach items="${users}" var="user" varStatus="s">
<tr>
<td> ${s.count} </td>
<td> ${user.userName} </td>
<td> ${user.gender} </td>
<td> ${user.age} </td>
<td>${user.tel}</td>
<td> ${user.password} </td>
<td>
<c:forEach items="${user.foods}" var="food">
${food.foodName}
</c:forEach>
</td>
<td>
<a class="cha" href="${pageContext.request.contextPath}/manger/findUserById?id=${user.id}">修改</a>
<a class="dle" href="javascript:deleteUser(${user.id})">删除</a>
<a class="check" href="${pageContext.request.contextPath}/findUserOrder">查询订单</a>
</td>
</tr>
</c:forEach>
</table>
<a class="add" href="${pageContext.request.contextPath}/user/add.jsp">添加用户</a>
<a class="return"href="${pageContext.request.contextPath}/manger/manger.jsp">返回</a>
</div>
</body>
3.web层
@Controller
@RequestMapping("/manger")
public class MangerController {
@Autowired
private MangerService mangerService;
@Autowired
private UserService userService;
@RequestMapping("/login")
public String login(Manger manger, HttpSession session, Model model) {
try {
Manger manger_login = mangerService.manger_login(manger);
//登录成功
//储存用户信息
session.setAttribute("manger", manger_login.getMangerName());
//重定向到succes.jsp页面
return "redirect:/manger/manger.jsp";
} catch (Exception e) {
e.printStackTrace();
//登录失败
//储存提示信息到request
model.addAttribute("longin_error", "用户名或密码错误!");
//转发到登陆页面
return "/manger/manger_login.jsp";
}
}
@RequestMapping("/findAllUser")
public String FindAllUser(Model model) {
List<User> users = mangerService.findAll();
//将list存入request域
model.addAttribute("users", users);
//转发到list.jsp
return "/manger/allUsers.jsp";
}
@RequestMapping("/updateUser")
public String UpdateUser(User user, String flag, Model model, HttpServletRequest request) {
userService.updateUser(user);
if (flag.equals("reg_success")) {
//用户更新
model.addAttribute("users", user);
//移除标志flag
request.removeAttribute("flag");
return "/user/userInformation.jsp";
} else {
//管理员更新
//跳转到查询所有的方法
return "/manger/findAllUser";
//response.sendRedirect(request.getContextPath() + "/userListServlet");
}
}
@RequestMapping("/addUser")
public String AddUser(User user){
//调用Service保存
mangerService.AddUser(user);
//跳转(重定向)到userListServle
return "/manger/findAllUser";
}
@RequestMapping("/findUserById")
public String FindUserById(String id, Model model,String flag){
User user = userService.findUserById(id);
//将user存入request
model.addAttribute("user",user);
//request.setAttribute("user",user);
//将标识传递
model.addAttribute("flag",flag);
//request.setAttribute("flag",flag);
//转发到update.jsp
return "/manger/update.jsp";
//request.getRequestDispatcher("/update.jsp").forward(request,response)
}
@RequestMapping("/findAllFood")
public String FindAllFood(Model model){
List<Food> foods = mangerService.findAllFood();
//存入request域中
model.addAttribute("foods",foods);
//转发到food.jsp
return "/manger/allFoods.jsp";
}
@RequestMapping("/addFood")
public String AddFood(Food foods){
mangerService.AddFood(foods);
//跳转(重定向)到查询所有食物
return "/manger/findAllFood";
}
@RequestMapping("/findFoodById")
public String FindFoodById(String id, Model model){
Food foods = mangerService.findFoodById(id);
//将user存入request
model.addAttribute("foods",foods);
//转发到update.jsp
return "/manger/updateFood.jsp";
}
@RequestMapping("/updateFood")
public String UpdateFood(Food food){
mangerService.updateFood(food);
return "/manger/findAllFood";
}
@RequestMapping("/deleteFood")
public String DeleteFood(String id){
mangerService.deleteFood(id);
//跳转(重定向)到checkFood
return "/manger/findAllFood";
}
}
4.service层
1.service接口
public interface MangerService {
//查询所有用户信息
public List<User> findAll();
//保存用户对象User
void AddUser(User user);
//实现管理员登陆
public Manger manger_login(Manger manger);
//查询菜品信息
List<Food> findAllFood();
//添加食品
void AddFood(Food foods);
Food findFoodById(String id);
void updateFood(Food food);
void deleteFood(String id);
}
2.service接口实现
@Service
public class MangerServiceImpl implements MangerService {
@Autowired
private MangerMapper mangerMapper;
@Override
public List<User> findAll() {
List<User> userList = mangerMapper.findAll();
//封装userList中的每一个user的food数据
for (User user : userList) {
//获得user的id
int id = user.getId();
//将user的id作为参数,查询对应food的集合数据
List<Food> foods =mangerMapper.findFoodsById(id);
user.setFoods(foods);
}
return userList;
}
@Override
public void AddUser(User user) {
mangerMapper.addUser(user);
}
@Override
public Manger manger_login(Manger manger) {
return mangerMapper.manger_login(manger);
}
@Override
public List<Food> findAllFood() {
return mangerMapper.findAllFood();
}
@Override
public void AddFood(Food foods) {
mangerMapper.addFood(foods);
}
@Override
public Food findFoodById(String id) {
return mangerMapper.findFoodById(Integer.parseInt(id));
}
@Override
public void updateFood(Food food) {
mangerMapper.updateFood(food);
}
@Override
public void deleteFood(String id) {
mangerMapper.deleteFoodById(Integer.parseInt(id));
}
}
5.mapper层
public interface MangerMapper {
//查询所有用户
public List<User> findAll();
//实现登录
Manger manger_login(Manger manger);
void addUser(User user);
//查询所有菜品
List<Food> findAllFood();
void addFood(Food foods);
Food findFoodById(int id);
void updateFood(Food food);
void deleteFoodById(int id);
//查中间表
List<Food> findFoodsById(int id);
}