JAVAEE第六次作业-SpringMVC+Spring+mybatis 项目实践

注:由于对SSM框架很陌生,配置文件部分自己弄了很久也不清楚,配置文件部分内容参考了罗付强同学的博客https://www.cnblogs.com/lfq4588/p/13094221.html

一、任务

使用ssm重新开发计科院新闻网站

二、创建SSM框架环境

2.1 新建Maven项目

方便对需要用的包进行管理

JAVAEE第六次作业-SpringMVC+Spring+mybatis 项目实践

Maven导入需要用到的包

<dependencies>
   <!--Junit-->
   <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>4.12</version>
   </dependency>
   <!--数据库驱动-->
   <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>5.1.47</version>
   </dependency>
   <!-- 数据库连接池 -->
   <dependency>
       <groupId>com.mchange</groupId>
       <artifactId>c3p0</artifactId>
       <version>0.9.5.2</version>
   </dependency>

   <!--Servlet - JSP -->
   <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>servlet-api</artifactId>
       <version>2.5</version>
   </dependency>
   <dependency>
       <groupId>javax.servlet.jsp</groupId>
       <artifactId>jsp-api</artifactId>
       <version>2.2</version>
   </dependency>
   <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>jstl</artifactId>
       <version>1.2</version>
   </dependency>

   <!--Mybatis-->
   <dependency>
       <groupId>org.mybatis</groupId>
       <artifactId>mybatis</artifactId>
       <version>3.5.2</version>
   </dependency>
   <dependency>
       <groupId>org.mybatis</groupId>
       <artifactId>mybatis-spring</artifactId>
       <version>2.0.2</version>
   </dependency>

   <!--Spring-->
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-webmvc</artifactId>
       <version>5.1.9.RELEASE</version>
   </dependency>
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-jdbc</artifactId>
       <version>5.1.9.RELEASE</version>
   </dependency>
</dependencies>

2.2 添加Web环境支持

JAVAEE第六次作业-SpringMVC+Spring+mybatis 项目实践

2.3 创建SSM项目文件结构

JAVAEE第六次作业-SpringMVC+Spring+mybatis 项目实践

  • Controller:用于将service的结果展示在前端页面
  • mapper:mabatis映射接口,编写SQL语句
  • pojo:实体类
  • service:业务层,和Controller进行交互

2.4 编写配置文件代码

  1. applicationContext.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:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       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/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--开启注解的扫描,希望处理service和dao,controller不需要Spring框架去处理-->
    <context:component-scan base-package="com.example" >
        <!--配置哪些注解不扫描-->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>

    <!--Spring整合MyBatis框架-->
    <!--配置连接池-->
    <bean >
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/users?useUnicode=true&amp;characterEncoding=utf8"/>
        <property name="username" value="root"/>
        <property name="password" value="123"/>
    </bean>

    <!--配置SqlSessionFactory工厂-->
    <bean >
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!--配置Dao接口所在包-->
    <bean >
        <property name="basePackage" value="com.example.mapper"/>
    </bean>

    <!--配置Spring框架声明式事务管理-->
    <!--配置事务管理器-->
    <bean >
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!--配置事务通知-->
    <tx:advice >
        <tx:attributes>
            <tx:method name="find*" read-only="true"/>
            <tx:method name="*" isolation="DEFAULT"/>
        </tx:attributes>
    </tx:advice>

    <!--配置AOP增强-->
    <aop:config>
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.example.service.impl.*ServiceImpl.*(..))"/>
    </aop:config>

</beans>
  1. springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">

    <!--开启注解扫描,只扫描Controller注解-->
    <context:component-scan base-package="com.example">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>

    <!--配置的视图解析器对象-->
    <bean >
        <!-- JSP文件所在的目录 -->
        <property name="prefix" value="/"/>
        <!-- 文件的后缀名 -->
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--过滤静态资源-->
    <mvc:resources location="css/" mapping="/css/**" />
    <mvc:resources location="js/" mapping="/js/**" />
    <mvc:resources location="image/" mapping="/image/**" />
    <mvc:resources location="UEditor/" mapping="/UEditor/**" />
    <mvc:resources location="images/" mapping="/images/**" />
    <mvc:resources location="page/" mapping="/page/**" />

    <!--开启SpringMVC注解的支持-->
    <mvc:annotation-driven/>

</beans>

三、完成SSM项目代码

编写代码之前,可以将MVC Model2中的Web资源拷贝到该项目,代码部分也可以简单修改转换为ssm的形式

3.1 pojo实体类编写

此处用到了lombok工具,实体类就不用编写复杂的get set方法了

//用户实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo {
    String uName="";    //用户名
    String uPwd="";     //用户密码
}
//新闻实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class News {

    private String newsId;
    private String title;
    private String newsContent;
    private String author;
    private String newsDate;

}

3.2 编写mapper数据库映射

  1. UserMapper
@Repository
public interface UserMapper {
    //判断当前账号是否正确
    @Select("select * from users_info where UID = #{UID} AND UPWD = #{UPWD}")
    UserInfo isUserExist(UserInfo userInfo);
}
  1. NewsMapper
@Repository
public interface NewsMapper {

    //增加新闻
    @Insert("insert into users.news (NewID,Title, NewsContent, Author, NewsDate)\n" +
            "        values (#{NewID},#{Title},#{NewsContent},#{Author},#{NewsDate});")
    int addNews(News news);

    //删除新闻
    @Delete(" delete from users.news where NewID = #{NewID};")
    int deleteNewsById(@Param("NewID") String newId);

    //修改新闻
    @Update("update users.news\n" +
            "set Title=#{Title},NewsContent=#{NewsContent},Author=#{Author},NewsDate=#{NewsDate}\n" +
            "where NewID = #{NewID};")
    int updateNewsById(News news);

    //查询一条新闻
    @Select("select * from users.news where NewID = #{NewID};")
    News queryNewsById(@Param("NewID") String newId);

    //查询所有新闻
    @Select("select * from users.news;")
    List<News> queryAllNews();
}

3.3 编写service的实现

  1. NewsServiceImpl
@Service("NewsService")
public class NewsServiceImpl implements NewsService {
    //service调dao层  组合mapper
    @Autowired
    private NewsMapper newsMapper;

    public void setNewsMapper(NewsMapper newsMapper) {
        //可增加其他代码
        this.newsMapper = newsMapper;
    }

    public boolean addNews(News news) {

        int rows = newsMapper.addNews(news);
        if (rows > 0) {
            return true;
        } else {
            return false;
        }
    }

    public boolean deleteNewsById(String newId) {
        int rows = newsMapper.deleteNewsById(newId);
        if (rows > 0) {
            return true;
        } else {
            return false;
        }
    }

    public boolean updateNewsById(News news) {
        int rows = newsMapper.updateNewsById(news);
        if (rows > 0) {
            return true;
        } else {
            return false;
        }
    }

    public News queryNewsById(String newId) {
        return newsMapper.queryNewsById(newId);
    }

    public List<News> queryAllNews() {
        return newsMapper.queryAllNews();
    }
}
  1. UserServiceImpl
@Service("UserService")
public class UserServiceImpl implements UserService {
    //service调dao层  组合mapper
    @Autowired
    private UserMapper userMapper;

    public void setUserMapper(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    //账号结果是否正确
    public boolean isUserExist(UserInfo userInfo) {
        UserInfo quertRes = userMapper.isUserExist(userInfo);
        if (quertRes == null) {
            return false;
        }

        if (quertRes.getUID() != null && quertRes.getUPWD() != null) {
            return true;
        } else {
            return false;
        }
    }
}

3.4 编写controller

  1. UserController
@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/login")
    public void login(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        UserInfo user = new UserInfo();
        user.setUID(username);
        user.setUPWD(password);

        boolean b = userService.isUserExist(user);
        if (b) {
            response.sendRedirect("page/index.html");
        } else {
            response.sendRedirect("index.jsp");
        }
    }
}
  1. NewsController(由于内容太多,只展示部分)
@RequestMapping("/viewNew")
public void viewNew(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    request.setCharacterEncoding("UTF-8");
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html; charset=UTF-8");

    String newsID = request.getParameter("newid");
    System.out.println(newsID);

    News news = null;
    news = newsService.queryNewsById(newsID);

    System.out.println(news.getNewID());
    System.out.println(news.getNewsContent());
    System.out.println(news.getNewsDate());
    System.out.println(news.getAuthor());

    request.setAttribute("news", news);
    //转发到content.jsp
    request.getRequestDispatcher("NewsContent.jsp").forward(request, response);
}

四、效果实现

效果与MVC Model2作业类似,但是SSM实现起来更方便了

  1. 删除编号为7的新闻

JAVAEE第六次作业-SpringMVC+Spring+mybatis 项目实践

JAVAEE第六次作业-SpringMVC+Spring+mybatis 项目实践

成功实现删除功能

  1. 添加新闻,点击左上方按钮即可

JAVAEE第六次作业-SpringMVC+Spring+mybatis 项目实践

  1. 跳转到新闻管理表单

JAVAEE第六次作业-SpringMVC+Spring+mybatis 项目实践

  1. 点写完内容点击更新

JAVAEE第六次作业-SpringMVC+Spring+mybatis 项目实践

  1. 成功添加新闻

JAVAEE第六次作业-SpringMVC+Spring+mybatis 项目实践

  1. 点击编辑按钮开始修改新闻内容

JAVAEE第六次作业-SpringMVC+Spring+mybatis 项目实践

  1. 修改部分内容

JAVAEE第六次作业-SpringMVC+Spring+mybatis 项目实践

成功完成修改

JAVAEE第六次作业-SpringMVC+Spring+mybatis 项目实践

  1. 点击查看新闻即可跳转到新闻详细界面中

JAVAEE第六次作业-SpringMVC+Spring+mybatis 项目实践

JAVAEE第六次作业-SpringMVC+Spring+mybatis 项目实践

  1. 官网效果实现

JAVAEE第六次作业-SpringMVC+Spring+mybatis 项目实践

跳转后页面

JAVAEE第六次作业-SpringMVC+Spring+mybatis 项目实践

五、码云地址

码云地址: https://gitee.com/Jason98/JavaEE-Course

JAVAEE第六次作业-SpringMVC+Spring+mybatis 项目实践

相关文章: