项目目的:
理解web应用的基本特点及webMVC的发展历程;掌握SpringMVC的请求处理过程。熟练掌握基于SpringMVC的web开发框架;熟练掌握基于注解的用户控制器的设计与开发及url映射的配置;掌握基于注解的请求数据绑定;能够利用SpringMVC进行简单的web开发(数据库操作使用mybatis或JPA)。
项目内容:
一、 SpringMVC开发环境与开发步骤
1、 在IntellJ中创建maven web项目(maven-archetype-webapp)
2、 补全项目结构
在src下创建test目录,并在test目录下创建java、resources目录;在main下创建java目录
3、 添加springmvc、servlet、json等的依赖包以及jetty插件
4、 在web.xml中添加springmvc前置控制器的配置,拦截所有请求
5、 在WEB-INF下添加SpringMVC的配置文件(包扫描及resolver配置)
6、 开发controller
7、 开发视图(jsp)
8、 运行测试站点:clean jetty:run -Djetty.port=8080
二、数据库建表:
三、系统原型:
四、系统需求:
1、系统需求:
①、用户注册与登录;②、简单设备资产管理(添加和查看):管理员(type=0的user)可在系统中添加设备(equipment)并可以同时指定该设备的领用保管人;管理员可以看所有的资产,普通用户只能看到自己的资产。
2、系统设计与开发
总体要求:所有的数据要落到数据库中,用什么方式操作数据库没有要求。
① 、规划设计用户请求处理
用户操作 | 请求名 | url | 请求类型 | 参数 | 功能描述 |
---|---|---|---|---|---|
注册 | DoRegister | /user/register | POST | @ModelAttribute(“user”) User user | 用户访问注册页面,填写注册表单,提交注册。 |
登录 | login | /user/login | POST | @RequestParam(“loginName”) String loginName, @RequestParam(“password”) String password, HttpSession session | 填写用户名、密码登录 |
查看个人设备 | home | /eq/home | GET | HttpSession session | 普通用户登录成功,跳转到home页面查看个人资产设备 |
管理员操作 | 请求名 | url | 请求类型 | 参数 | 功能描述 |
查看全部资产 | home | /eq/home | GET | HttpSession session | 管理员登录成功后,home页面显示全部资产情况 |
添加设备 | addEquipment | /eq/add | POST | HttpServletRequest request | 管理员登录home页面可以添加设备,指定领用人 |
② 、用户注册、登录。
③ 、用户成功登录/注册后将当前登录用户的信息通过HttpSession写入session,用户注册成功后直接转向【用户home页面】,显示当前登录用户名下的所有设备资产信息
④ 、【系统管理员(type=0)】成功登录后转向【管理员home页面】,显示所有设备资产信息。同时可以在该页面中为用户登记新的设备。
五、具体代码实现:
本项目功能使用传统三层架构实现:Controller、Service、Dao
Dao层使用注解@Repository
将数据层添加到bean
Service层使用@Autowired
自动装配获取到dao层,并且使用@Service
注解添加到bean
Controller层同样使用@Autowired
自动装配获取到service层,并且使用@Controller
注解添加到bean
创建项目、依赖导入、配置文件……之前的环境搭建环节不做展示。
1、注册功能:
用户浏览器url访问到注册页面,填写注册表单后提交给后台服务器处理,提交表单是POST请求,而浏览器只能响应GET请求,所以先写GET请求方法显示注册页面。其中的return “user/register”
就是访问注册页面的意思,即找到对应的 .jsp文件加载jsp/user/register.jsp
当用户填写好表单信息,点击注册按钮,表单信息以POST方式提交到后台,后台进行具体业务处理操作:将用户信息存放到数据库中的tb_user
表中。其中的userService.addUser(user);
是Controller调用Service,Service在Dao中进行数据库的更新操作,即存入注册的用户信息。而return “redirect:/user/login”;
是重定向到登录页面,你可以理解为 注册好后,浏览器跳转到login——登录页面。
这里的用户信息保存到数据库中时,有一个字段叫type,用来区分用户类型,注册后我固定保存为 1 普通用户。到此,注册功能基本完成。
2、登录功能:
注册完成后跳转到的登录页面如下,
要实现的功能为:填写用户名、密码后点击“登录”按钮进入home系统页面,
也是POST请求,提交的数据传回后台进行具体业务逻辑操作判断:用户是否存在(从数据库中能否查询到用户)?用户存在 密码是否填写正确?是普通用户还是管理员用户?根据这些判断结果来显示不同的页面信息。
数据库中有一个字段 last_login_time 最后一次登录时间,如果登录成功后,我们还要更新这个日期。
登录的具体逻辑是这样的:
注册成功后 页面重定向 跳转到登录页面,而浏览器只支持GET请求访问,所以前一个login方法的GET请求,return “user/login”
即加载login.jsp文件来访问到登录页面。
登录表单POST提交后来到第二个login方法,它的请求方法为POST是跟jsp文件中对应的,这个方法里面来编写具体的业务操作:先调用UserService在UserDao里从数据库中查询信息 比对,没问题后代表登陆成功,更新登录时间,最后return “redirect:/eq/home”
页面跳转到home系统页面 ;若有问题,用户不存在/用户名密码错误?跳转页面显示error信息即可。到此,登录功能即完成。
当然,在此页面下,如果没有账户,还是可以点击注册按钮回到register页面进行注册。
3、home系统页面:
用户登录成功,进入系统页面查看资产信息。
我的操作是:eq/home请求先判断用户类型,如果是管理员,则显示所以资产,并可以操作资产(添加资产,指定领用人);如果是普通用户,页面显示的只有他个人的资产信息。
首先肯定是列出资产设备信息的表现层:
判断出是管理员用户后,页面还得显示出管理设备的功能表格,下面是添加设备功能对应的JSP和Controller核心代码:
其中
是在jsp文件中添加一个下拉框,用于选择设备的领用人。其中,通过session.getAttribute(“allUsers”)获取到所有的用户列表,然后使用for循环遍历列表,将每个用户的id和真实姓名作为一个选项添加到下拉框中。当用户选择一个选项时,该选项的value值就会被发送到服务器端,用于添加设备记录时设置设备的领用人。
<% for (User u : (List) session.getAttribute(“allUsers”)) { %>
<%= u.getRealName() %>
<% } %>
Controller中添加完成后返回的return “添加完成”
因为方法前面加了@ResponseBody
注解,返回值将会直接在页面中提示。
到此,home系统页面的基本功能也已完成。
下面是普通用户和管理员登录的效果图:
基本功能和核心代码展示完成。
六、完整代码类
UserController类:
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserServiceImpl userService;
/**
* 注册
*
* @return
*/
@RequestMapping(value = "/registe", method = RequestMethod.GET)
public String register() {
return "user/register";
}
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String DoRegister(@ModelAttribute("user") User user) {
userService.addUser(user);
return "redirect:/user/login";
}
/**
* 登录
*
* @return
*/
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login() {
return "user/login";
}
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(@RequestParam("loginName") String loginName, @RequestParam("password") String password, HttpSession session) {
User user = userService.getUserByNameAndPassword(loginName, password);
List<User> allUsers = userService.getAllUsers();
session.setAttribute("allUsers", allUsers);
if (user != null) {
// 更新用户lastlogin时间
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = sdf.format(date);
userService.updateLastLoginTime(dateString, user);
session.setAttribute("user", user);
return "redirect:/eq/home";
} else {
session.setAttribute("error", "error");
return "error";
}
}
}
UserService接口和UserServiceImpl类:
public interface UserService {
void addUser(User user); //注册
List<User> getAllUsers();
User getUserByNameAndPassword(String username, String password); //用户登录
void updateLastLoginTime(String formattedDate, User user); //更新用户登录时间
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDaoImpl userDao;
@Override
public void addUser(User user) {
userDao.addUser(user);
}
@Override
public List<User> getAllUsers() {
return userDao.getAllUsers();
}
@Override
public User getUserByNameAndPassword(String username, String password) {
return userDao.findByLoginNameAndPassword(username,password);
}
@Override
public void updateLastLoginTime(String date,User user) {
userDao.updateUserLastLoginTime(date,user);
}
}
UserDao接口和UserDaoImpl类:
public interface UserDao {
void addUser(User user); //注册
List<User> getAllUsers(); //获取所有用户
User findByLoginNameAndPassword(String loginName, String password); //用户登录
void updateUserLastLoginTime(String formattedDate, User user); //更新用户最后登录时间
}
@Repository
public class UserDaoImpl implements UserDao {
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
@Override
public void addUser(User user) {
//定义sql
String sql = "insert into tb_user(login_name,real_name,password,telephone,email) values(?,?,?,?,?)";
//2.执行sql
template.update(sql, user.getLoginName(),
user.getRealName(),
user.getPassword(),
user.getTelephone(),
user.getEmail()
);
}
@Override
public List<User> getAllUsers() {
String sql = "SELECT * FROM tb_user";
List<User> users = template.query(sql, new BeanPropertyRowMapper<>(User.class));
return users;
}
@Override
public User findByLoginNameAndPassword(String loginName, String password) {
String sql = "SELECT * FROM tb_user WHERE login_name = ? AND password = ? ";
Object[] args = {loginName, password};
List<User> users = template.query(sql, args, new BeanPropertyRowMapper<>(User.class));
if (users != null && users.size() > 0) {
return users.get(0);
} else {
return null;
}
}
@Override
public void updateUserLastLoginTime(String formattedDate, User user) {
String sql = "UPDATE tb_user SET last_login_time = ? WHERE login_name = ?";
template.update(sql, formattedDate, user.getLoginName());
}
}
EquipmentController类:
@Controller
@RequestMapping("/eq")
public class EquipmentController {
@Autowired
private EquipmentServiceImpl equipmentService;
/**
* 列出资产设备
*/
@RequestMapping(value = "/home", method = RequestMethod.GET)
public String home(HttpSession session) {
User user = (User) session.getAttribute("user");
if (user == null) { //用户为空,回到登录页面
return "user/login";
}
if (user.getType() == 1) { //普通用户
List<Equipment> equipments = equipmentService.getEquipmentByUserId(user.getId());
session.setAttribute("equipments", equipments);
return "eq/home";
}else if(user.getType()==0){ //管理员
List<Equipment> allEquipments = equipmentService.getAllEquipments();
session.setAttribute("equipments", allEquipments);
return "eq/home";
}
else {
session.setAttribute("error","你没有权限访问改页面");
return "error";
}
}
/**
* 管理员添加设备
*/
@RequestMapping(value = "/add",method = RequestMethod.POST)
@ResponseBody
public String addEquipment(HttpServletRequest request){
String name = request.getParameter("name");
String code = request.getParameter("code");
double price = Double.parseDouble(request.getParameter("price"));
String place = request.getParameter("place");
int uerId = Integer.parseInt(request.getParameter("userId"));
Equipment equipment = new Equipment();
equipment.setName(name);
equipment.setCode(code);
equipment.setPrice(price);
equipment.setPlace(place);
equipment.setUserId(uerId);
equipment.setAddTime(new Date());
equipmentService.addEquipment(equipment);
return "添加完成";
}
}
EquipmentService和EquipmentServiceImpl类:
public interface EquipmentService {
List<Equipment> getEquipmentByUserId(int userid); //查询出用户资产设备
List<Equipment> getAllEquipments();
void addEquipment(Equipment equipment);
}
@Service
public class EquipmentServiceImpl implements EquipmentService {
@Autowired
private EquipmentDaoImpl equipmentDao;
@Override
public List<Equipment> getEquipmentByUserId(int userid) {
return equipmentDao.getEquipmentByUserId(userid);
}
@Override
public List<Equipment> getAllEquipments() {
return equipmentDao.getAllEquipments();
}
@Override
public void addEquipment(Equipment equipment) {
equipmentDao.addEquipment(equipment);
}
}
EquipmentDao和EquipmentDaoImpl类:
public interface EquipmentDao {
List<Equipment> getEquipmentByUserId(int userId); //查询出用户资产设备
List<Equipment> getAllEquipments(); //查询出所有资产设备
void addEquipment(Equipment equipment);
}
@Repository
public class EquipmentDaoImpl implements EquipmentDao {
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
@Override
public List<Equipment> getEquipmentByUserId(int userId) {
String sql = "SELECT * FROM tb_equipment WHERE user_id = ? ";
Object[] args = {userId};
return template.query(sql,args,new BeanPropertyRowMapper<>(Equipment.class));
}
@Override
public List<Equipment> getAllEquipments() {
String sql = "SELECT * FROM tb_equipment ";
return template.query(sql,new BeanPropertyRowMapper<>(Equipment.class));
}
@Override
public void addEquipment(Equipment equipment) {
String sql = "INSERT INTO tb_equipment (`name`,code,price,place,user_id,add_time) VALUES (?, ?, ?, ?, ?, ?)";
template.update(sql,equipment.getName(),
equipment.getCode(),
equipment.getPrice(),
equipment.getPlace(),
equipment.getUserId(),
equipment.getAddTime());
}
}
七、提示
本文未写项目搭建、环境配置、数据库创建、实体类创建、JSP文件内容
完整项目结构:
完整项目源码在gitee
:https://gitee.com/li-zhi_xiang/lzx-springmvc