注意,以下userPassward都改写为userPassword!!!!
环境搭建好后,项目结构如下图:
1、在src-》main-》java-》cn.smbms中建包(controller、dao、pojo、service)。
2、在dao层下建包role、user。根据情况建立相应包。
3、在 src-》main下建包webapp
4、代码编写,在controller层中先写一些方法
Controller层负责具体的业务模块流程的控制。其中参数user Code和userPassword与login.html 及 frame.html页面相关联。
该层中主要编写代码如下:
5、在pojo实体类层下建立实体类User.java
以下先从dao层开始
6、在dao层user目录下建立接口
7、因为不用另外写UserMapperImpl来实现接口,因此需要先在application.yml下进行配置,如下。
该代码是用来映射实体的别名。
8、 在resources目录下建立如下目录
并在目录user下建立xml文件。
9、在UserMapper.xml文件下编写代码如下
以上dao层先告一段落
接下来是service层 ,实现业务逻辑
10、在service层中建立包
UserService接口代码如下:
UserServiceImpl实现代码如下:
servic层先暂停
11、回到controller层
在controller层的方法doLogin中,将return后改为"redirect:/main "。再写一个方法,将其剥离开,通过main跳转到frame.jsp页面。
但这样的话,用户如果知道了这个地址http://localhost:8081/main 便可以不用输入密码,直接进入了frame.jsp页面。这样是我们不想要的,所以需要拦截。进行一个简单的拦截,.
所以,如果在地址栏直接输入http://localhost:8081/main会跳转到登陆页面。
角色列表显示
1、controller层中新建RoleController.java
此时只是把页面显示出来,还没和数据库连接。
2、进行与数据库相关——找到dao层,建立RoleMapper接口。此时又需要建立实体类,在pojo层中,建立Role.java。
public List getRoleList();//查询所有列表角色信息。
3、编写RoleMapper.xml配置映射文件
4、在service层建立接口和实现
RoleService:
package cn.smbms.service.role;
import cn.smbms.pojo.Role;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
public interface RoleService {
public List getRoleList();
}
RoleServiceImpl.java:
package cn.smbms.service.role;
import cn.smbms.dao.role.RoleMapper;
import cn.smbms.pojo.Role;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 角色业务实现。
*/
@Service
public class RoleServiceImpl implements RoleService{
@Autowired
private RoleMapper roleMapper;
//查询角色列表
@Override
public List getRoleList() {
return roleMapper.getRoleList();
}
}
5、此时需要将数据库数据传到前台。
List roleList = roleService.getRoleList();
使用此代码将数据从数据库拿过来,接下来想办法将数据传到前台。写一个参数model ?????
在RoleController.java中:
import cn.smbms.pojo.Role;
import cn.smbms.service.role.RoleService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
/**
* 角色控制器
*/
@Controller
@RequestMapping("/sys/role")
public class RoleController {
private RoleService roleService;
@RequestMapping("/list.html")//上面的目录名+这个目录名就是要访问的路径
public String roleList(Model model){
List roleList = roleService.getRoleList();//已将数据从数据库拿过来,接下来想办法将数据传到前台。
model.addAttribute("roleList",roleList);//""里的roleList是rolelist.jsp里面的key.
return "rolelist";
}
}
6、此时可以启动运行看看,报了个错-_-!!!
类似这种,不过我的现在已经好了,找不到我原来报错的信息了,和这个差不多。
Description:
Field userMapper in com.example.demo.service.impl.UserServiceImpl required a bean of type 'com.example.demo.dao.IUserMapper' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:Consider defining a bean of type '
cn.smbms.dao.user.UserMapper' in your configuration.修改方案:
在启动了类中添加注解
@MapperScan(value = "cn.smbms.dao.user")
7、增加角色
所有逻辑顺序为:Mapper.java-->mapper.xml-->XXService.java-->xxServiceImpl.java-=>XXXController.java.
在RoleController.java中添加方法:
@RequestMapping("/add.html") //和rolelist中的”添加角色“代码处的路径一致
public String toAdd() {
return "roleadd";//跳转到roleadd.jsp
}
在RoleMapper.java中:
@Mapper
public interface RoleMapper {
//此时要返回一个角色列表list,用到泛型
public List getRoleList();//查询所有列表角色信息。
public int insert(Role role);
}
在RoleMapper.xml中添加:
(其中#{}里面的内容要和实体类的属性一样。)
id属性名和RoleMapper里面添加的方法名是相关联一样的。
insert into smbms_role(roleCode,roleName,createBy,creationDate) VALUES (#{roleCode},#{roleName},#{createBy},#{creationDate})
在RoleService接口中添加:
public boolean addRole(Role role);
在RoleServiceImpl.java中进行实现:
@Override
public boolean addRole(Role role) {
int result = roleMapper.insert(role);
if(result>0){
return true;
}
return false;
}
在RoleController.java中:
/**
* 此刻要真正实现角色添加
*
* 在roleadd.jsp里面,需要把所填的值“角色编码”和“角色名称”传到后台,
* 在这里,直接写一个参数role
* 但要保证Role里面的属性名与roleadd.jsp里面的‘name’属性铭一样。
*
* @param role
* @return
*/
@RequestMapping("/addsave.html")//要和在roleadd.jsp里面form标签后的路径名最后一个一致。
public String add(Role role){
boolean result = roleService.addRole(role);
if(result){
return "redirect:/sys/role/list.html";
}
return "roleadd";
}
又报错了!!!什么鬼
org.apache.ibatis.binding.BindingException: Mapper method 'cn.smbms.dao.role.RoleMapper.insert attempted to return null from a method with a primitive return type (int).
有人说:UPDATE 语句和INSERT INTO 语句 默认都返回的是 int类型 所java代码中接收的都是int类型 controller 需要改成Integer这样会减少一些意外的错误。
但我RoleMapper里面设置的返回类型就是int型的呀!
和这个没关系友友们!
在RoleMapper.xml里面,添加角色应该用
标签而不是 完成!
出现了一个问题:
页面上未显示创建时间以及由谁创建(隐式数据)
需要在RoleController.java中添加:
角色添加模块完成了 !!
8、角色修改
RoleController.java中添加:
方法上面的注解:
@RequestMapping("/toUpdate.html")要与rolelist.jsp的
一致。
这个
?id=${role.id}是将此处角色的id传到数据库,不能少。否则点击修改不回显。
点击修改后,要进行"用户编码"等字段的回显:
RoleMapper.java中添加:
public Role getRoleById(@Param("id") String id);//@Param里面的参数id 与Mapper.xml中的#{}一致。
RoleMapper.xml中添加:
RoleService.java中添加:
public Role getRoleById(String id);
RoleServiceImpl.java中添加:
//修改角色时进行”用户编码“的回显。
@Override
public Role getRoleById(String id) {
Role role = roleMapper.getRoleById(id);
return role;//此步也可以直接写成return roleMapper.getRoleById(id);
}
回到RoleController.java:
在rolemodify.jsp页面中这个表达式中的role
与controller中的要一致。
字段回显完成!!
正式修改保存开始:
RoleMapper.java:
public int update(Role role);
RoleMapper.xml:
update smbms_role set roleCode=#{roleCode},roleName=#{roleName},modifyDate=#{modifyDate} where id=#{id}
RoleService.java:
public boolean delete(String id);
RoleServiceImpl.java:
@Override
public boolean updateRole(Role role) {
int result=roleMapper.update(role);
if(result>0){
return true;
}
return false;
}
RoleController:
@RequestMapping("/modifysave.html")//进行正式修改
public String update(Role role,HttpSession session){
User user=(User) session.getAttribute("userSession");
// role.setModifyBy(user.getId());//由谁创建
role.setModifyDate(new Date());//会显示修改时间
//System.out.println("Date");
boolean result = roleService.updateRole(role);
if(result){
return "redirect:/sys/role/list.html";
}
return "rolemodify";
}
小知识点: