处女座:ssm框架一个简易的新闻管理系统

SSM框架制作简易新闻系统

一、搭建环境(略)

二、创建mysql数据库webdb

1、创建数据表user

2、创建数据表news

三、创建maven项目myWeb,在pox.xml里加载项目所需依赖包

<!-- spring框架所需jar包10个 -->

<!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
<dependency>
  <groupId>aopalliance</groupId>
  <artifactId>aopalliance</artifactId>
  <version>1.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.8.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aop</artifactId>
  <version>4.3.6.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aspects</artifactId>
  <version>4.3.6.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-beans</artifactId>
  <version>4.3.6.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>4.3.6.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>4.3.6.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-expression</artifactId>
  <version>4.3.6.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>4.3.6.RELEASE</version>
</dependency>

<!-- spring mvc所需jar包2个-->

<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>4.3.6.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>4.3.6.RELEASE</version>
</dependency>

<!--mybatis框架所需jar包13个-->

<!-- https://mvnrepository.com/artifact/org.apache.ant/ant -->
<dependency>
  <groupId>org.apache.ant</groupId>
  <artifactId>ant</artifactId>
  <version>1.9.6</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.ant/ant-launcher -->
<dependency>
  <groupId>org.apache.ant</groupId>
  <artifactId>ant-launcher</artifactId>
  <version>1.9.6</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.ow2.asm/asm -->
<dependency>
  <groupId>org.ow2.asm</groupId>
  <artifactId>asm</artifactId>
  <version>5.1</version>
</dependency>

<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
  <groupId>cglib</groupId>
  <artifactId>cglib</artifactId>
  <version>3.2.4</version>
</dependency>

<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
  <groupId>commons-logging</groupId>
  <artifactId>commons-logging</artifactId>
  <version>1.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
<dependency>
  <groupId>org.javassist</groupId>
  <artifactId>javassist</artifactId>
  <version>3.21.0-GA</version>
</dependency>

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-api</artifactId>
  <version>2.3</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.3</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.4.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/ognl/ognl -->
<dependency>
  <groupId>ognl</groupId>
  <artifactId>ognl</artifactId>
  <version>3.1.12</version>
</dependency>

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.22</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.7.22</version>
  <scope>test</scope>
</dependency>

<!-- mybatis与spring整合的中间jar包1个 -->

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>1.3.1</version>
</dependency>

<!-- mysql驱动包 -->

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.48</version>
</dependency>

<!-- 数据源所需jar(dbcp,2个) -->

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-dbcp2</artifactId>
  <version>2.1.1</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-pool2</artifactId>
  <version>2.4.2</version>
</dependency>

<!-- jstl标签库jar两个 -->

<!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-impl -->
<dependency>
  <groupId>org.apache.taglibs</groupId>
  <artifactId>taglibs-standard-impl</artifactId>
  <version>1.2.5</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-spec -->
<dependency>
  <groupId>org.apache.taglibs</groupId>
  <artifactId>taglibs-standard-spec</artifactId>
  <version>1.2.5</version>
</dependency>

<!--jackson框架所需jar包3个-->
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>2.8.6</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.8.6</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.8.6</version>
</dependency>

<!-- java工具类jar包1个-->
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
  <version>3.4</version>
</dependency>

四、配置spring,springmvc,mybatis,数据库,日志文件等

在main目录下创建resources资源包

1、在resources包里创建数据库配置文件db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/webdb?useSSL=false
jdbc.username=root
jdbc.password=root
jdbc.maxTotal=30
jdbc.maxIdle=10
jdbc.initialSize=5

2、创建log4j.properties

# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.ssm.core=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

3、配置spring

<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-4.3.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.3.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
    <!--读取db.properties -->
    <context:property-placeholder location="classpath:db.properties"/>
    <!-- 配置数据源 -->
    <bean id="dataSource"
          class="org.apache.commons.dbcp2.BasicDataSource">
        <!--数据库驱动 -->
        <property name="driverClassName" value="${jdbc.driver}" />
        <!--连接数据库的url -->
        <property name="url" value="${jdbc.url}" />
        <!--连接数据库的用户名 -->
        <property name="username" value="${jdbc.username}" />
        <!--连接数据库的密码 -->
        <property name="password" value="${jdbc.password}" />
        <!--最大连接数 -->
        <property name="maxTotal" value="${jdbc.maxTotal}" />
        <!--最大空闲连接  -->
        <property name="maxIdle" value="${jdbc.maxIdle}" />
        <!--初始化连接数  -->
        <property name="initialSize" value="${jdbc.initialSize}" />
    </bean>
    <!-- 事务管理器 -->
    <bean id="transactionManager" class=
            "org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 数据源 -->
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!-- 通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 传播行为 -->
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="insert*" propagation="REQUIRED" />
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="create*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="find*" propagation="SUPPORTS"
                       read-only="true" />
            <tx:method name="select*" propagation="SUPPORTS"
                       read-only="true" />
            <tx:method name="get*" propagation="SUPPORTS"
                       read-only="true" />
        </tx:attributes>
    </tx:advice>
    <!-- 切面 -->
    <aop:config>
        <aop:advisor advice-ref="txAdvice"
                     pointcut="execution(* com.ssm.core.service.*.*(..))" />
    </aop:config>
    <!-- 配置 MyBatis的工厂 -->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 数据源 -->
        <property name="dataSource" ref="dataSource" />
        <!-- 配置MyBatis的核心配置文件所在位置 -->
        <property name="configLocation"
                  value="classpath:mybatis-config.xml" />
    </bean>
    <!-- 接口开发,扫描 com.ssm.core.dao包 ,写在此包下的接口即可被扫描到 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.ssm.core.dao" />
    </bean>
    <!-- 配置扫描@Service注解 -->
    <context:component-scan base-package="com.ssm.core.service"/>
</beans>

4、配置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.ssm.core.po" />
    </typeAliases>
</configuration>

5、配置springmvc

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
  http://www.springframework.org/schema/mvc
  http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
  http://www.springframework.org/schema/context
  http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    <!--加载属性文件-->
<!--    <context:property-placeholder-->
<!--            location="classpath:resource.properties"/>-->
    <!-- 配置包扫描器,扫描@Controller注解的类 -->
    <context:component-scan base-package="com.ssm.core.web.controller" />
    <!-- 加载注解驱动 -->
    <mvc:annotation-driven />
    <!--配置静态资源的访问映射,此配置中的文件不被前端控制器拦截-->
    <mvc:resources mapping="/js/**" location="/js/"/>
    <mvc:resources mapping="/css/**" location="/css/"/>
    <mvc:resources mapping="/fonts/**" location="/fonts/"/>
    <mvc:resources mapping="/images/**" location="/images/"/>
    <!-- 配置视图解析器 -->
    <bean id="jspViewResolver"
          class=
                  "org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/" />
        <property name="suffix" value=".jsp" />
    </bean>
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/admin/**"/>
            <bean class="com.ssm.core.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
</beans>

6、配置项目配置文件web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
   http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         id="WebApp_ID" version="3.1">
  <!-- 配置加载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>encoding</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>encoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!-- 配置Spring MVC前端核心控制器 -->
  <servlet>
    <servlet-name>crm</servlet-name>
    <servlet-class>
      org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-config.xml</param-value>
    </init-param>
    <!-- 配置服务器启动后立即加载Spring MVC配置文件 -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>crm</servlet-name>
    <!--/:拦截所有请求(除了jsp)-->
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <!--系统默认页面-->
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

五、创建项目目录结构及文件

在main目录下创建java文件夹,标注为source root

创建如下包结构

说明:controller负责接收jsp页面传递来的参数,调用service里方法进行业务逻辑,service方法调用dao层来操控数据库

(一)在po包里创建对应数据表的实体类

News和Admin

package com.ssm.core.po;

/**
 * @Author: palapala
 * @Description:闻实体类
 */
public class News {
    public int getNewsID() {
        return NewsID;
    }

public void setNewsID(int newsID) {
        NewsID = newsID;
    }

public String getNewsTitle() {
        return NewsTitle;
    }

public void setNewsTitle(String newsTitle) {
        NewsTitle = newsTitle;
    }

public String getNewsContent() {
        return NewsContent;
    }

public void setNewsContent(String newsContent) {
        NewsContent = newsContent;
    }

public String getNewsTime() {
        return NewsTime;
    }

public void setNewsTime(String newsTime) {
        NewsTime = newsTime;
    }

public String getAdminName() {
        return AdminName;
    }

public void setAdminName(String adminName) {
        AdminName = adminName;
    }

private Integer NewsID;
    private String NewsTitle;
    private String NewsContent;
    private String NewsTime;
    private String AdminName;
    private Integer start;//起始行
    public Integer getStart() {
        return start;
    }

public void setStart(Integer start) {
        this.start = start;
    }

public Integer getRows() {
        return rows;
    }

public void setRows(Integer rows) {
        this.rows = rows;
    }

private Integer rows;//所取行数
}

package com.ssm.core.po;

public class Admin {
    private Integer AdminID;

public Integer getAdminID() {
        return AdminID;
    }

public void setAdminID(Integer adminID) {
        AdminID = adminID;
    }

public String getAdminName() {
        return AdminName;
    }

public void setAdminName(String adminName) {
        AdminName = adminName;
    }

public String getAdminPwd() {
        return AdminPwd;
    }

public void setAdminPwd(String adminPwd) {
        AdminPwd = adminPwd;
    }

public Integer getAdminType() {
        return AdminType;
    }

public void setAdminType(Integer adminType) {
        AdminType = adminType;
    }

public String getLastLoginTime() {
        return LastLoginTime;
    }

public void setLastLoginTime(String lastLoginTime) {
        LastLoginTime = lastLoginTime;
    }

private String AdminName;
    private String AdminPwd;
    private Integer AdminType;
    private String LastLoginTime;

}

(二)在Dao层创建接口文件

Dao层两个接口文件

1、NewsDao

package com.ssm.core.dao;

import com.ssm.core.po.News;

import java.util.List;

/**
 * @Author: palapala
 * News接口
 */
public interface NewsDao {
    //新闻列表
    List<News> selectNews(News news);
    //新闻数量
    Integer selectNewsListCount(News news);
    //增加新闻
    int addNews(News news);
    //更新新闻
    int updateNews(News news);
    //删除新闻
    int delNews(Integer NewsId);
    News getNewsByID(Integer NewsID);
}

2、UserDao

package com.ssm.core.dao;

import com.ssm.core.po.Admin;
import org.apache.ibatis.annotations.Param;

/**
 * @Author: palapala
 * DAO接口
 */
public interface UserDao {
    public Admin findUser(@Param("AdminName") String AdminName,
                          @Param("AdminPwd") String AdminPwd);
}

这两个接口和resources目录下同路径xml文件共同构成mybatis的映射文件来操控数据库

NewsDao.xml

<?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.ssm.core.dao.NewsDao">

<!-- 查询新闻列表  -->
    <select id="selectNews" parameterType="news"
            resultType="news">
        SELECT
        NewsID,
        NewsTitle,
        NewsContent,
        NewsTime,
        AdminName
        FROM
        news

<if test="start !=null and rows != null">
            limit #{start},#{rows}
        </if>
    </select>
    <!-- 查询客户总数 -->
    <select id="selectNewsListCount" parameterType="news"
            resultType="Integer">
        select count(*) from news

</select>

<!-- 添加新闻 -->
    <insert id="addNews" parameterType="news">
        insert into news(
             NewsID,
            NewsTitle,
            NewsContent,
            NewsTime,
            AdminName
        )
        values(#{NewsID},
               #{NewsTitle},
               #{NewsContent},
               #{NewsTime},
               #{AdminName}
              )
    </insert>

<!--    <!– 根据id获取客户信息 –>-->
<!--    <select id="getCustomerById" parameterType="Integer"-->
<!--            resultType="customer">-->
<!--        select * from customer where cust_id = #{id}-->
<!--    </select>-->
    <!-- 更新客户 -->
    <update id="updateNews" parameterType="news">
        update news
        <set>
            <if test="NewsID!=null">
                NewsId=#{NewsID},
            </if>
            <if test="NewsTitle!=null">
                NewsTitle=#{NewsTitle},
            </if>
            <if test="NewsContent!=null">
                NewsContent=#{NewsContent},
            </if>
            <if test="NewsTime!=null">
                NewsTime=#{NewsTime},
            </if>
            <if test="AdminName!=null">
                AdminName=#{AdminName},
            </if>

</set>
        where NewsID=#{NewsID}
    </update>

<!-- 删除客户 -->
    <delete id="delNews" parameterType="Integer">
        delete from news where NewsID=#{NewsID}
    </delete>
    <!-- 新闻详情-->
    <select id="getNewsByID" parameterType="Integer"
            resultType="news">
         SELECT
        NewsID,
        NewsTitle,
        NewsContent,
        NewsTime,
        AdminName
        FROM
        news
        where
        NewsID=#{NewsID}
    </select>
</mapper>

NewsDao.xml

<?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.ssm.core.dao.UserDao">

<!-- 查询管理员  -->
    <select id="findUser" parameterType="String"
            resultType="Admin">
        SELECT
        *
        FROM
        admin
    </select>

</mapper>

(三)在sevice层创建接口及实现类

1、NewsService接口

package com.ssm.core.service;
import com.ssm.common.utils.Page;
import com.ssm.core.po.News;

import java.util.List;

public interface NewsService {
    // 查询新闻列表
    Page<News> findNewsList(Integer page,Integer rows);
    int createNews(News news);

// 更新新闻
    int updateNews(News news);

// 删除新闻
    int delNews(Integer id);
    News getNewsByID(Integer NewsID);

}

实现类

package com.ssm.core.service.impl;

import com.ssm.common.utils.Page;
import com.ssm.core.dao.NewsDao;
import com.ssm.core.po.News;
import com.ssm.core.service.NewsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional
public class NewsServiceImpl implements NewsService {
    //声明dao属性并注入
    @Autowired
    private NewsDao newsDao;
    //新闻列表
    public Page<News> findNewsList(Integer page,Integer rows) {
        News news=new News();
        // 当前页
        news.setStart((page-1) * rows);
        news.setRows(rows);
        //查询新闻列表
        List<News> news1 = newsDao.selectNews(news);
        //查询新闻列表总记录数
        Integer count = newsDao.selectNewsListCount(news);
        //创建page的返回对象
        Page<News> result=new Page<>();
        result.setPage(page);
        result.setRows((news1));
        result.setSize(rows);
        result.setTotal(count);
        return result;
    }

public int createNews(News news) {
        int i = newsDao.addNews(news);
        return i;
    }

public int updateNews(News news) {
        return  newsDao.updateNews(news);
    }

public int delNews(Integer id) {
        return  newsDao.delNews(id);
    }

public News getNewsByID(Integer NewsID){
        News news=newsDao.getNewsByID(NewsID);
        return news;
    }
}

2、UserService接口及实现类

package com.ssm.core.service;

import com.ssm.core.po.Admin;
import org.springframework.stereotype.Service;

/**
 * @Author: palapala
 * @Description:
 * @Date: Created in 21:08 2020/3/11
 * @Modified By:
 */
@Service
public interface UserService {
    Admin findUser(String AdminName,String AdminPwd);
}

package com.ssm.core.service.impl;

import com.ssm.core.dao.UserDao;
import com.ssm.core.po.Admin;
import com.ssm.core.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @Author: palapala
 * @Description:
 * @Date: Created in 21:12 2020/3/11
 * @Modified By:
 */
@Service
@Transactional
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;

@Override
    public Admin findUser(String AdminName, String AdminPwd) {
        return this.userDao.findUser(AdminName, AdminPwd);
    }
}

(四)在web层创建俩个controller

1、NewsController

/**
 * 管理控制器
 */
@Controller
public class NewsController {
    // 依赖注入
    @Autowired
    private NewsService newsService;
    private Admin admin;

@RequestMapping(value = "/newsFrontList")
    public String list(@RequestParam(defaultValue="1")Integer page,
                       @RequestParam(defaultValue="10")Integer rows,
                       Model model) {
        // 条件查询所有客户
        Page<News> newsPage = newsService
                .findNewsList(page, rows);
        model.addAttribute("page", newsPage);

return "/front/newsFrontList";
    }
    @RequestMapping(value = "/about")
    public String list1(){
        return "front/about";
    }
    @RequestMapping(value = "/content")
    public String list2(){
        return "front/content";
    }
    @RequestMapping(value = "/contact")
    public String list3(){
        return "front/contact";
    }
  @RequestMapping(value = "/newsFrontDetail")
  public String getNewsByID(Integer NewsID, Model model) {
      // 根据ID查询新闻
      News news = newsService.getNewsByID(NewsID);
      model.addAttribute("News",news);
      return "/front/newsFrontDetail";
  }

@RequestMapping(value = "/admin/newsAdmin")
    public String newsList(@RequestParam(defaultValue = "1")Integer page,
                           @RequestParam(defaultValue = "10")Integer rows,Model model,HttpSession session){
      Page<News> newsList = newsService.findNewsList(page, rows);
      model.addAttribute("page",newsList);
      Admin user_session = (Admin) session.getAttribute("USER_SESSION");
      if(user_session!=null)
        session.setAttribute("user",admin);
      return "/admin/news";
  }
  @RequestMapping(value = "/admin/newsAdd")
    public String  newsAdd(String NewsTitle,String NewsContent, Model model,HttpSession session){

News news=new News();
      Admin user_session = (Admin) session.getAttribute("USER_SESSION");
      news.setAdminName(user_session.getAdminName());
      news.setNewsTitle(NewsTitle);
      news.setNewsContent(NewsContent);
      news.setNewsTime("2020-3-12");
      int row= newsService.createNews(news);
      Page<News> newsList = newsService.findNewsList(1, 10);
      model.addAttribute("page",newsList);
      if(row>0){
          return "admin/news";
      }
      System.out.println("添加失败");
      return "admin/news";
  }
  //修改新闻
    @RequestMapping(value = "/admin/newsUpdate")
    public String newsUpdate(News news, Model model){

int i = newsService.updateNews(news);

if(i>0){
            return "redirect:/newsAdmin";
        }
        System.out.println("添加失败");
        return "redirect:/newsAdmin";
    }
    @RequestMapping(value = "/admin/editNews")
    public String edtiNews(News news,Model model){
        Integer id=news.getNewsID();
        News newsByID = newsService.getNewsByID(id);
        model.addAttribute(newsByID);
        return "admin/newsEdit";
    }
    @RequestMapping(value = "/admin/delNews/{NewsID}",method = RequestMethod.GET)
    public String delNews(@PathVariable("NewsID") Integer NewsID) {
        int i = newsService.delNews(NewsID);
        if(i>0){
            System.out.println("删除成功");
            return "redirect:/newsAdmin";
        }
            System.out.println("删除失败");
            return "redirect:/newsAdmin";

}
    @RequestMapping(value = "/index")
    public String index(HttpSession session){
        session.invalidate();
        return "/front/index";
    }
}

2、UserController

/**
 * @Author: palapala
 * @Description:
 * @Date: Created in 21:21 2020/3/11
 * @Modified By:
 */
@Controller
public class UserController {

@RequestMapping(value = "/admin/login")
    public String llist(){

return "/admin/login";
    }

@Autowired
    private UserService userService;
    @RequestMapping(value = "/admin/login",method = RequestMethod.POST)
    public String login(String AdminName,String AdminPwd,Model model,HttpSession session){
        Admin admin=userService.findUser(AdminName,AdminPwd);
        if(admin != null){
            // 将用户对象添加到Session
            session.setAttribute("USER_SESSION", admin);
            // 跳转到主页面
            model.addAttribute("Admin",admin);
            return "/admin/adminUser";
            //          return "redirect:customer/list.action";
        }
        model.addAttribute("msg", "账号或密码错误,请重新输入!");
        // 返回到登录页面
        return "admin";
    }

}

(五)在interceptor里创建拦截器

package com.ssm.core.interceptor;

import com.ssm.core.po.Admin;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * @Author: palapala
 * @Description:
 * @Date: Created in 1:13 2020/3/10
 * @Modified By:
 */
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取请求的Url
        StringBuffer requestURL = request.getRequestURL();
        //URL:除了登录请求外,其他的url都进行拦截
        if(requestURL.indexOf("/login")>=0){
            return true;
        }
        //获取session
        HttpSession session = request.getSession();
        Admin user_session = (Admin)session.getAttribute("USER_SESSION");
        //判断session中是否有用户数据,如果有,则返回true继续向下执行
        if(user_session != null){
            return true;
        }
        //不符合条件的给出提示信息,并转发到登录页面
        request.setAttribute("msg","您还没有登录,请先登录");
        request.getRequestDispatcher("/admin/login").forward(request,response);
        return false;
    }

@Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

}

@Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

}
}

(六)在common.utils下创建翻页类

1、翻页效果NavigationTag

package com.ssm.common.utils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.IOException;
import java.util.Map;

/**
 * 示格式:首上一1 2 3 4 5下一
 */
public class NavigationTag extends TagSupport {
    static final long serialVersionUID = 2372405317744358833L;
    /**
     * request 中用于保存Page<E> 象的量名,认为“page”
     */
    private String bean = "page";
    /**
     * url地址,性必
     */
    private String url = null;
    /**
     * 页码数
     */
    private int number = 5;

@Override
    public int doStartTag() throws JspException {
        JspWriter writer = pageContext.getOut();
        HttpServletRequest request =
                (HttpServletRequest) pageContext.getRequest();
        Page page = (Page) request.getAttribute(bean);
        if (page == null)
            return SKIP_BODY;
        url = resolveUrl(url, pageContext);
        try {
            // 计算总页数
            int pageCount = page.getTotal() / page.getSize();
            if (page.getTotal() % page.getSize() > 0) {
                pageCount++;
            }
            writer.print("<nav><ul class=\"pagination\">");
            //首页链接路径
            String homeUrl = append(url, "page", 1);
            //末页链接路径
            String backUrl = append(url, "page", pageCount);
            // 显示“上一页”按钮
            if (page.getPage() > 1) {
                String preUrl = append(url, "page", page.getPage() - 1);
                preUrl = append(preUrl, "rows", page.getSize());
                writer.print("<li><a href=\"" + homeUrl + "\">" + "首页</a></li>");
                writer.print("<li><a href=\"" + preUrl + "\">" + "上一页</a></li>");
            } else {
                writer.print("<li class=\"disabled\"><a href=\"#\">" + "首页 </a></li>");
                writer.print("<li class=\"disabled\"><a href=\"#\">" + "上一页 </a></li>");
            }
            // 显示当前页码的前2页码和后两页码
            // 若1 则 1 2 3 4 5, 若2 则 1 2 3 4 5, 若3 则1 2 3 4 5,
            // 若4 则 2 3 4 5 6 ,若10 则 8 9 10 11 12
            int indexPage =1;
            if(page.getPage() - 2 <=0){
                indexPage=1;
            }else if(pageCount-page.getPage() <=2){
                indexPage=pageCount-4;
            }else{
                indexPage= page.getPage() - 2;
            }
            for (int i= 1;i <= number && indexPage <= pageCount;indexPage++,i++){
                if (indexPage == page.getPage()) {
                    writer.print("<li class=\"active\"><a href=\"#\">" + indexPage
                            +"<spanclass=\"sr-only\"></span></a></li>");
                    continue;
                }
                String pageUrl = append(url, "page", indexPage);
                pageUrl = append(pageUrl, "rows", page.getSize());
                writer.print("<li><a href=\"" + pageUrl + "\">" + indexPage + "</a></li>");
            }
            // 显示“下一页”按钮
            if (page.getPage() < pageCount) {
                String nextUrl = append(url, "page", page.getPage() + 1);
                nextUrl = append(nextUrl, "rows", page.getSize());
                writer.print("<li><a href=\"" + nextUrl + "\">" + "下一页</a></li>");
                writer.print("<li><a href=\"" + backUrl + "\">" + "尾页</a></li>");
            } else {
                writer.print("<li class=\"disabled\"><a href=\"#\">" + "下一页</a></li>");
                writer.print("<li class=\"disabled\"><a href=\"#\">" + "尾页</a></li>");
            }
            writer.print("</nav>");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return SKIP_BODY;
    }

private String append(String url, String key, int value) {
        return append(url, key, String.valueOf(value));
    }
    /**
     * url 参数对儿
     */
    private String append(String url, String key, String value) {
        if (url == null || url.trim().length() == 0) {
            return "";
        }
        if (url.indexOf("?") == -1) {
            url = url + "?" + key + "=" + value;
        } else {
            if (url.endsWith("?")) {
                url = url + key + "=" + value;
            } else {
                url = url + "&" + key + "=" + value;
            }
        }
        return url;
    }
    /**
     * url 添加翻页请参数
     */
    private String resolveUrl(String url,
                              javax.servlet.jsp.PageContext pageContext) throws JspException {
        Map params = pageContext.getRequest().getParameterMap();
        for (Object key : params.keySet()) {
            if ("page".equals(key) || "rows".equals(key)){
                continue;
            }
            Object value = params.get(key);
            if (value == null){
                continue;
            }
            if (value.getClass().isArray()) {
                url = append(url, key.toString(), ((String[]) value)[0]);
            } else if (value instanceof String) {
                url = append(url, key.toString(), value.toString());
            }
        }
        return url;
    }
    public String getBean() {
        return bean;
    }
    public void setBean(String bean) {
        this.bean = bean;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public void setNumber(int number) {
        this.number = number;
    }
}

2、Page类

package com.ssm.common.utils;

import java.util.List;
public class Page<T> {
    private int total;    // 总条数
    private int page;     // 当前页
    private int size;     // 每页数
    private List<T> rows; // 结果集
    public int getTotal() {
        return total;
    }
    public void setTotal(int total) {
        this.total = total;
    }
    public int getPage() {
        return page;
    }
    public void setPage(int page) {
        this.page = page;
    }
    public int getSize() {
        return size;
    }
    public void setSize(int size) {
        this.size = size;
    }
    public List<T> getRows() {
        return rows;
    }
    public void setRows(List<T> rows) {
        this.rows = rows;
    }
}

上面完成了后台程序的基本开发,剩下的只需把jsp页面放到WEB-INF下即可,css,js,img等资源文件放在webapp根目录下即可

这个项目只是个简单的项目,里面还有很多需要优化及解决的问题,等过一阵我再进行细节的优化。

我也是在学习中,所以会有很多的不合适的地方希望大家批评指正。

原文地址:https://www.cnblogs.com/palapala/p/12521108.html

时间: 2024-10-11 22:29:34

处女座:ssm框架一个简易的新闻管理系统的相关文章

如何做一个简易的新闻客户端

1,下载一个服务端 tomcat 下载后开始运行,将需要浏览的东西,放在webapps-root文件下 这里假设有一个xml小文件,接下来就开始上代码了, 在同一个包下给mainactivity创造两个class文件,一个用来解析xml文件(解析方式多种,有兴趣可以上网查阅资料),一个用于存放数据 1,存放数据: package com.example.xinwen; public class News { private String city; private String temp; pr

基于SSM框架的电子政务档案管理系统,JAVA系统

最近了解了电子政务档案管理系统项目,在这个平台记录一下这个电子政务档案管理系统项目,方便以后再次使用或学习的时候能够及时的翻阅.在完成这个项目的时候,考虑了很多框架.最终决定选用SSM(MYECLIPSE),该框架具有极强的移植性,多平台性,便于操作性等优点.此框架能在MYECLIPSE开发工具中完美的编写和运行,电子政务档案管理系统为一个 后台项目.这个项目的描述是这样的:电子政务是国家实施政府职能转变,提高政府管理.公共服务和应急能力的重要举措,有利于带动整个国民经济和社会信息化的发展.电子

基于SSM框架下的JAVA增值税管理系统

每天记录学习,每天会有好心情.*^_^* 今天和一个朋友共同完成了一个增值税管理系统项目,我们在开发时选用的框架是SSM(MYECLIPSE)框架.我这个朋友知识有限,只会这个框架,哈哈,都是为了方便他.和往常一样选用简单又便捷的MYECLIPSE作为开发工具,这是一个 后台项目.这个系统的介绍是这样的:增值税管理系统,涵盖基础.信息管理.数据采集管理.发票流转管理.销项开具管理.进项发票管理.纳税申报管理.税务风险预警.税务档案管理.涉税统计分析.税控设备管理.系统管理等 12 个功能模块.可

实验楼mysql实验-搭建一个简易的成绩管理系统的数据库

网址如下https://www.shiyanlou.com/courses/running ,pass之后的体验还蛮好的,. 首先打开终端,双击xfce终端或右键打开终端 开启数据库服务 ,连接数据库 首先创建新的数据库create database gradesystem; 接着选择新创建的数据库 use gradesystem; 进行建表,使用create table 语句,分别建立三个表,student,course,mark 其中stdent表的sid和course表的cid分别是mar

[后端人员耍前端系列]AngularJs篇:使用AngularJs打造一个简易权限系统

一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJS来打造一个简易的权限管理系统.下面不多说,直接进入主题. 二.整体架构设计介绍 首先看下整个项目的架构设计图: 从上图可以看出整个项目的一个整体结构,接下来,我来详细介绍了项目的整体架构: 采用Asp.net Web API来实现REST 服务.这样的实现方式,已达到后端服务的公用.分别部署和更好地扩展.Web层依赖应用服务接口,并且使

AngularJs打造一个简易权限系统

AngularJs打造一个简易权限系统 一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJS来打造一个简易的权限管理系统.下面不多说,直接进入主题. 二.整体架构设计介绍 首先看下整个项目的架构设计图: 从上图可以看出整个项目的一个整体结构,接下来,我来详细介绍了项目的整体架构: 采用Asp.net Web API来实现REST 服务.这样的实现方式,已达到后端服务的公用.分别部署和更好

自行实现一个简易RPC框架

10分钟写一个RPC框架 1.RpcFramework package com.alibaba.study.rpc.framework; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; imp

使用idea搭建一个简单的SSM框架:(3)配置spring+mybatis

在此之前请先查看: 使用idea搭建一个简单的SSM框架:(1)使用idea创建maven项目 使用idea搭建一个简单的SSM框架:(2)配置springMVC 1 配置spring和mybatis整合文件 spring和mybatis整合分为三个步骤:(1)配置数据库,(2)配置SqlSessionFactoryBean (来自mybatis-spring),(3)配置MapperScannerConfigurer,该配置就我们通过接口定义的方法,就是mybatis的xml对应的namesp

一个基于SSM框架开发的高并发电商秒杀Web系统

0 前言 一个基于SSM框架的高并发秒杀系统采用IDEA+Maven+SSM+Mysql+Redis+Jetty.Bootstrap/Jquery开发. 通过这个小项目,理清了基于SSM框架开发Web应用的流程以及常见的避坑方法,并在最后简单采用了Redis缓存以及Mysql Procedure对项目进行了高并发优化. 接下来从DAO层.Service层.Web层开发以及高并发优化4个方面梳理整个项目开发过程. 源码地址https://github.com/Allegr0/seckill 项目准