• SSM思路大总结(部门信息的显示和增删改查)


    #ssm整合(部门管理)

    ##1.新建工程

    1.新建maven工程
    2.添加web.xml
    3.添加tomcat运行环境
    4.添加依赖jar包

    spring-webmvc
    mysql
    commonse-dbcp
    mybatis
    mybatis-spring
    junit
    jstl //作用
    spring-jdbc

    5.配置文件

    application-dao.xml
    //作用:用util:propertis读取外部属性文件db.properties
    //配置数据库连接池信息:1.用spring表达式给属性赋值
    //ssm整合 持久层接口的扫描 仔细看看
    //SqlSessionFactoryBean的初始化(mybatis的用法 : 实例化数据库,有几个数据库实例化就实例化)
    //读取编写sql语句的映射文件


    application-service.xml //扫描组件 可以扫描当前包(业务层)和子包的所有类
    spring-mvc.xml //作用:配置控制层(看看),扫描控制层组件 配置视图解析器,读取要显示的页面

    db.properties //作用:配置数据库连接池
    mappers/DeptMapper.xml //作用:命名空间(接口名)

    6.web.xml

    ##2.建表t_dept

    create table t_dept(
    id int auto_increment primary key,
    dept_name varchar(50),
    dept_loc varchar(50)
    )default charset=utf8;

    ##3.添加部门信息


    新建包:cn.zjtj.ssm.bean
    新建Dept类:

    public class Dept {
    private Integer id;
    private String deptName;
    private String deptLoc;
    
    ...
    }

    ###3.1 持久层

    1.定义接口

    在cn.zjtj.ssm.dao包中定义DeptDao,在接口中定义方法

    public interface DeptDao{
    void insertDept(Dept dept);
    }

    2.编写sql语句
    在DeptMapper.xml中定义insert节点,编写insert语句语句

    namespace=cn.zjtj.ssm.dao.DeptDao    
    <insert id="insertDept" parameterType="cn.zjtj.ssm.bean.Dept">
    insert into t_dept(
    dept_name,dept_loc
    )values(
    #{deptName},#{deptLoc}
    )
    </insert>    


    测试:
    //加载application-dao.xml dao层配置文件, 这是容器配置
    new ClassPathXmlApplicationContext("application-dao.xml");

    //加载这个接口文件 进行操作 看看第一天的视频或查API 接口名
    DeptDao dao =ac.getBean("deptDao",DeptDao.class);

    //创建对象并赋值
    Dept dept = new Dept();
    dept.setDeptName("第一开发部");
    dept.setDeptLoc("中坤8层");
    dao.insertDept(dept);

    //查看数据库信息

    ###3.2 业务层

    1.定义接口cn.zjtj.ssm.service

    public interface DeptService{
    void addDept(Dept dept);
    }

    2.编写接口的实现类
     

    @Service
    public class DeptServiceImpl implements DeptService{
    @Resource //作用 : 按name进行依赖注入, 多个文件之间要相互调用,它起的作用是初始化和赋值的作用  
    //??用法和含义 https://blog.csdn.net/zcl_love_wx/article/details/78629401
    private DeptDao deptDao;
    public void addDept(Dept dept){
    //调用持久层的方法
    }
    }

    测试: 

    ###3.3 控制器层 (业务层为控制器调用)

    1.cn.zjtj.ssm.controller中定义DeptController
    
    @Controller
    @RequestMapping("/dept") //一个路径,一个模块名称
    public class DeptController{
    //显示添加部门信息页面
    @RequestMapping("/showAddDept.do") //一个下一级路径,一个方法的绑定
    public String showAddDept(){ //显示页面无需参数 
    return "addDept"; //输入上面的路径 显示addDept.jsp页面 输入参数
    }
    
    //添加部门信息
    RequestMapping("/addDept.do")
    public String addDept(String deptName,String deptLoc){
    
    //这里接受上面输入的参数值,并返回到index.jsp页面
    
    //1.调用业务层方法 业务层调用持久层,把数据存到数据库中
    //把参数传进来,并响应页面
    //2.return "index";
    Dept dept = new Dept();
    dept.setDeptName(deptName);
    dept.setDeptLoc(deptLoc);
    deptService.addDept(dept);
    return "index";
    }
    
    }

    ###3.4 页面

    /WEB-INF/web/addDept.jsp,两个文本框+submit按钮
    在addDept.jsp的form表单中,给action赋值
    /WEB-INF/web/index.jsp,添加成功!

    ...action="${pageContext.request.contextPath}/dept/addDept.do"> ?????????
    ...

    这里相当于有个重定向的过程, 先从显示页面输入参数,输入成功调转到登录添加成功的页面,多一个方法绑定
    和一个jsp页面显示。


    测试:

    出现了404页面

    ...
    
    //application-dao.xml 路径出问题了 配置文件前后不匹配
    
    <util:properties id="dbConf" location="classpath:db.properties"/>
    
    <property name="mapperLocations" value="classpath:mappers/*.xml">
    
    ...


    如果还出现了404,就可能是pring-mvc.xml配置文件下扫描包出现了问题
    <!--组件扫描-->

    <context:component-scan base-package="cn.zjtj.ssm.controller"/>

    接下来出现500页面
    方法出错。


    输入网址:localhost:8080/day08_ssm/dept/showAddDept.do

    当页面出来后,输入参数值就传入数据库端

    控制层调用业务层 业务层调用持久层
    一般如果写的话,是倒着写 不管是具体类中的方法的代码 还是各个层的写法

    ===============================================================


    ##4.显示部门信息

    思路分析1:添加成功页面之后加一个超链接(显示部门信息,有多条信息),这个时候就要用到jstl表达式,
    用于遍历并显示输出。点击超链接提交给控制器,控制器去调用业务层,业务层去调用持久层,持久层去查数
    据库,并将所有的数据返回来。
    由于是多个对象(数据库中),所以,持久层返回的应该是一个集合。


    思路分析2:对于一个新的模块,肯定还是需要数据,那么就需要数据库,那么还是要从持久层开始,
    再通过业务层,把持久层的集合带回来,带回来之后把集合中的数据放到控制器里面,控制器再把它
    放到map里面,在把它扔到页面上来(显示出来)。

    思路分析3:数据库---->持久层------>业务层---->控制器层---->页面 分析思路是这样的,但如果执行的化是从反着执行。

    ###4.1 持久层

    1.在DeptDao接口中定义方法

    List<Dept> selectDeptAll(); //返回值为一个部门信息,并且无返回值

    2.在DeptMapper.xml文件中定义select节点,编写sql语句

    DeptMapper.xml

    ......

    //id名称就是方法名称,参数列表无,但是有返回值类型 resultType="xx.xx.Dept" 包下面的某个类
    </insert> <!--List<Dept> selectDeptAll()--> <!--查询用户信息--> <select id="selecDeptAll" resultType="cn.zjtj.ssm.bean.Dept"> select id, dept_name deptName, dept_loc deptLoc from t_dept </select>

    测试 :

    TestDept.java

    ...
    
    @Test
    public void testSelectAll(){
    
    //读取dao的配置文件(容器) 获得dao的对象名(容器的对象) 再进行方法的调用 最后close(),避免发生内存泄露
    
    ...
    
    System.out.println(dao.selectDeptAll()); //在控制台输出。
    
    }
    
    ...
    
    //在控制台输出。

    ###4.2 业务层 

    说明:持久层是查询 这里是获取 。

    1.接口中定义方法:List<Dept> getDeptAll();

    ......
    
    /*添加部门信息
    * @Param dept
    */
    void addDept(Dept dept);
    /*
    *获取部门信息
    *@return
    */
    List<Dept> getDeptAll();
    .....

    2.实现类中实现方法,方法的功能:调用持久层的方法,把list返回

    public List<Dept> getDeptAll(){
    return deptDao.selectDeptAll();
    }


    ###4.3 控制器

    思路分析:当用户点击超链接时候,提交请求到控制器,所以这里要获取部门信息

    url

    /getAll.do
    //提交请求到控制器,所以这里要获取部门信息
    参数列表:ModelMap map
    //控制器的参数列表是否需要参数? 由于输入参数是一次请求,所以这里需要ModelMap MedelMap具体含义和用法 ??如果多次请求呢?
    响应方法:转发--------------showAll.jsp

    public String getAll(ModelMap map){
    //1.调用业务层方法;返回list,把list添加到map
    //2.return "showAll";
    }

    ###4.4 页面

    1.在index.jsp定义<a href="${}/dept/getAll.do">显示部门信息</a><br> //这里一请求就请求控制器,并返回showAll.jsp

    2.在web/新建showAll.jsp页面,页面:显示部门信息


    测试:

    ================================================================================

    ##5.删除部门

    ###5.1 持久层

    1.定义方法:void deleteDeptById(Integer id);

    2在映射文件中,定义delete节点,编写delete语句

    <delete id="deleteDeptById">
    delete from t_dept
    where
    id=#{id}
    </delete>

    测试:

    ###5.2 业务层

    1.在接口中定义方法:void removeById(Integer id);

    2.在实现类中实现方法,方法的功能:调用持久层的方法

    ###5.3 控制器层
    url
    /removeDept.do
    参数列表:id
    响应页面:重定向 ------------------/getAll.do

    @RequestMapping("/removeDept.do")
    public String removeDept(Integer id){
    //1.调用业务层方法
    //2.return "redirect:../dept/getAll.do";
    }

    ###5.4 页面

    <a herf="${}/dept/removeDept.do?id=${dept.id}">删除</a>

     ------------------------------------------------------------------------------------------------------------------------

    服务型的SSM整合:

    建工程/并做相应配置

     

    添加数据库

     

    写实体类

     

    写持久层(写相关抽象方法)

     

    写映射文件,并写命名空间和相应的接口,然后实现相应的操作方法,再写测试类

     

    再写业务层,并实现并实现持久层方法(逻辑控制“如密码验证”和处理的一个过程)(要用@Resource依赖注入)

     

    再写控制器层(逻辑显示"密码显示"和信息传输"AJAX刷新和用JSON进行信息交互"的过程),并返回相应的页面,在WEB-INF/web/addDept.jsp

    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    Webx5 label的取值和赋值(div)
    webx5 复选框的显示
    WebX5 Data遍历以及获取数组最后一个元素(更新)
    API集市--分享API
    WebX5 Data判断当前行的值是否改变,以及改变当前行的状态
    WebX5手机GPS定位,无需开启网络
    JS:var 变量=变量 && 变量
    jQuery的ready ()的几种写法
    .net 微信支付(公众号支付)遇到的问题
    .net中的Dictionary字典类的使用方法
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/9615196.html
Copyright © 2020-2023  润新知