构建SpringMVC学生管理系统

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42105395/article/details/81454679

一、项目介绍
构建学生管理系统,实现增减改查功能。
SpringMVC框架中的控制器DispatcherServlet 通过handlerMapping将请求映射到处理器,通过注解@Controller的方式生成对象。
二、所用技术
SpringMVC框架
Mybatis
Oracle
三、环境搭建
1、安装Eclipse,配置JDK环境
2、安装Tomcat
在Apache Tomcat 官网上下载任意版本(最好是7以上)的Tomcat,在Eclipse环境下配置Tomcat。
打开Eclipse,单击“Window”菜单,选择下方的“Preferences”。单击“Server”选项,选择下方的“Runtime Environments”。点击“Add”添加Tomcat。点击“Next”,选中自己安装的Tomcat路径。点击“Finish”完成。
Tomcat默认端口为8080。
3、安装Oracle
四、配置文件
1、SpringMVC
(1)建立JavaWeb项目
建立一个 Java 项目,命名为MyWeb
在项目下新建一个文件夹 webapp (命名可自取,这个目录即是网站根目录),再在该文件夹下新建一个 WEB-INF 文件夹(命名固定),WEB-INF 作为 Tomcat 启动后的安全文件夹,浏览器不能访问到该目录下的资源。tomcat 启动会默认会在此目录下读取相应配置文件。
在 WEB-INF 下建立 web.xml 文件(命名固定),这是配置文件。
在 WEB-INF 下建立 jsp 文件夹(命名可自取),用来存放相关的 jsp 文件(MVC 的 View)。
在 WEB-INF 下建立 lib 文件夹(命名固定),用来存放相关的 jar 包。
(2)Spring安装
从官网下载需要的版本,比如 spring-framework-4.1.9.RELEASE-dist.zip。
解压,将 \spring-framework-4.1.9.RELEASE\libs 目录的下 jar 包拷贝到项目的 lib 目录下
(3)Spring配置
A、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">
  <context-param>
    <param-name>contextConfigLocation</param-name><!-- 创建上下文 -->
    <param-value>WEB-INF/applicationContext-*.xml</param-value>
  </context-param>
  <listener><!-- 创建监听器 -->
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <servlet><!-- DispatcherServlet 通过handlerMapping将请求映射到处理器-->
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>WEB-INF/springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping><!-- url-pattern设置哪些请求被Spring MVC处理 -->
    <servlet-name>spring</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <filter>
    <filter-name>encodingFilter</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>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>*.do</url-pattern>
  </filter-mapping>
</web-app>

其中比较重要的是DispatcherServlet的配置。
B、springmvc.xml配置
在WEB-INF 下创建 springmvc.xml (名称(spring)和 web.xml 中配置的 <servlet-name>spring</servlet-name> 中的 spring 名称要对应)

<?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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    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-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,
如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类注册为bean -->
    <context:component-scan base-package="com.myweb" />
    <mvc:annotation-driven />
    <!-- 配置视图解析器, 指定控制器页面转向的目录及文件后缀。 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

在这个项目中通过注解的方式将请求映射到具体的Action中(即后面说到的IndexAction.java文件)。具体实现方式是:在springmvc.xml中配置<mvc:annotation-driven />自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,是spring MVC为@Controllers分发请求所必须的,即解决了@Controller注解使用的前提配置。并在action类中加上

@Controller
@RequestMapping("/user")

2、Mybatis配置
(0)Oracle
首先要下载oracle数据库,可以一起下载它的客户端文件sqlplus。创建用户,创建表空间。

create tablespace 表空间名 DATAFILE '本地文件地址.DBF' SIZE 10M;
alter database datafile '本地文件地址.DBF' autoextend on;
create user 用户名 identified by 密码 default tablespace 表空间名;

grant connect to 用户名;
grant resource to 用户名;

创建表

create table 表名(......);

(1)db.properties
JDBC API是一个Java API可以访问任何类型的数据库的数据,尤其是存储在关系数据库中的数据。需要引入ojdbc.jar包。

jdbc.driver=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
jdbc.username=/*你的用户名*/
jdbc.password=/*你的用户名*/

(2)SqlMapConfig.xml

<?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>
    <!-- 配置分页插件 -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->        
            <property name="dialect" value="oracle"/>
        </plugin>
    </plugins>
</configuration>

(3)applicationContext-dao.xml
其中数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    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-4.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

    <!-- 数据库连接池 -->
    <!-- 加载配置文件 -->
    <context:property-placeholder location="WEB-INF/*.properties" />
    <!-- 数据库连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
        destroy-method="close">
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="maxActive" value="10" />
        <property name="minIdle" value="5" />
    </bean>
    <!-- 配置sqlsessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="WEB-INF/SqlMapConfig.xml"></property>
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 配置扫描包,加载mapper代理对象 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.mapper"></property>
    </bean>
</beans>

3、接口类配置
UserMapper.xml和AdminMapper.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" >
<!-- 在dao层/Mapper层定义一个接口,然后定义一个对应的xml(xml中namespace的值对应接口的全限定名 -->
<mapper namespace="com.mapper.UserMapper" >
  <resultMap id="BaseResultMap" type="com.pojo.User" >
    <id column="studentid" property="studentid" jdbcType="INTEGER" />
    <result column="studentname" property="studentname" jdbcType="VARCHAR" />
    <result column="studentage" property="studentage" jdbcType="INTEGER" />
    <result column="studentsex" property="studentsex" jdbcType="VARCHAR" />
    <result column="studenttel" property="studenttel" jdbcType="INTEGER" />
    <result column="classid" property="classid" jdbcType="INTEGER" />

  </resultMap>
  <sql id="Base_Column_List" >
    studentid, studentname, studentage,studentsex,studenttel,classid
  </sql>
  <select id="selectByExample" resultMap="BaseResultMap" parameterType="com.pojo.User" >
    select
    <if test="distinct" >
      distinct
    </if>
    <include refid="Base_Column_List" />
    from studentinfo

    <if test="orderByClause != null" >
      order by ${orderByClause}
    </if>
  </select>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
    select 
    <include refid="Base_Column_List" />
    from studentinfo
    where studentid = #{studentid,jdbcType=BIGINT}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long" >
    delete from studentinfo
    where studentid = #{studentid,jdbcType=INTEGER}
  </delete>

  <insert id="insert" parameterType="com.pojo.User">
        insert into studentinfo(studentid,studentname,studentsex,studentage,studenttel,classid) 
        values(#{studentid,jdbcType=INTEGER},#{studentname,jdbcType=VARCHAR},#{studentsex,jdbcType=VARCHAR},
        #{studentage,jdbcType=INTEGER},#{studenttel,jdbcType=INTEGER},#{classid,jdbcType=INTEGER})
</insert>
<insert id="insertSelective" parameterType="com.pojo.User" >
    insert into studentinfo
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="studentid != null" >
        studentid,
      </if>

      <if test="studentname != null" >
        studentname,
      </if>
      <if test="studentage != null" >
        studentage,
      </if>
      <if test="studentsex != null" >
        studentsex,
      </if>
      <if test="studenttel != null" >
        studenttel,
      </if>
      <if test="classid != null" >
        classid,
      </if>

    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="studentid != null" >
        #{studentid,jdbcType=INTEGER},
      </if>
      <if test="studentname != null" >
        #{studentname,jdbcType=VARCHAR},
      </if>
      <if test="studentage != null" >
        #{studentage,jdbcType=INTEGER},
      </if>
      <if test="studentsex != null" >
        #{studentsex,jdbcType=VARCHAR},
      </if>
      <if test="studenttel != null" >
        #{studenttel,jdbcType=INTEGER},
      </if>

      <if test="classid != null" >
        #{classid,jdbcType=INTEGER},
      </if>

    </trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.pojo.User" >
    update studentinfo
    <set >
      <if test="studentname!= null" >
        studentname= #{studentname,jdbcType=VARCHAR},
      </if>
      <if test="studentage!= null" >
        studentage= #{studentage,jdbcType=INTEGER},
      </if>
      <if test="studentsex!= null" >
        studentsex= #{studentsex,jdbcType=VARCHAR},
      </if>
      <if test="studenttel!= null" >
        studenttel= #{studenttel,jdbcType=INTEGER},
      </if>
      <if test="classid!= null" >
        classid= #{classid,jdbcType=INTEGER},
      </if>

    </set>
    where studentid = #{studentid,jdbcType=BIGINT}
  </update>
</mapper>

五、控制器
在src下添加com.myweb包,创建IndexAction.java文件,作为Controller。

package com.myweb;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.mapper.UserMapper;
import com.mapper.AdminMapper;
import com.pojo.User;
import com.pojo.Administrator;
@org.springframework.stereotype.Controller/*扫描到了controller,将indexaction类生成bean对象*/
@RequestMapping("/index")
public  class IndexAction  {

    public String view;
    /*Spring自动将bean中引用的对象的set和get方法省略,直接自动生成*/
    @Autowired
    UserMapper userMapper;
    @Autowired
    AdminMapper adminMapper;
    public String getView() {
        return view;
    }
    public void setView(String view) {
        this.view=view;
    }
    @RequestMapping("/list")
    //设置相应的内容为json数据
    //@ResponseBody
    /*@RequestParam用于将请求参数区数据映射到功能处理方法的参数上,用于参数的传递*/
    public String getItemlist(@RequestParam String type ,HttpServletRequest arg0, HttpServletResponse arg1) {
        String result ="";
        if (type.equals("land")){
             result= "land";
            }
        else if(type.equals("select")) {
            result="select";
        }
        else if(type.equals("condition2")) {
            User record=new User();
            String studentname=arg0.getParameter("studentname");
            String studentage=arg0.getParameter("studentage");
            String studenttel=arg0.getParameter("studenttel");
            String studentsex=arg0.getParameter("studentsex");
            String classid=arg0.getParameter("classid");
            String studentid=arg0.getParameter("studentid");
            record.setStudentid(Long.parseLong(studentid));
            record.setStudentage(Integer.parseInt(studentage));
            record.setStudenttel(Long.parseLong(studenttel));
            record.setClassid(Integer.parseInt(classid));
            record.setStudentname(studentname);
            record.setStudentsex(studentsex);
            Long stu=Long.parseLong(studentid);
            User u=userMapper.selectByPrimaryKey(stu);
            if(u==null) {
                userMapper.insertSelective(record);
                result = "success";
            }
            else {
                result="wrong2";}
                }
        else if(type.equals("showinformation")) {
            List<Administrator> list=adminMapper.selectByExample();
            arg0.setAttribute("item", list);
            result = "showinformation";
            }
        else if(type.equals("selected")) {
            String studentid=arg0.getParameter("studentid");
            Long stu=Long.parseLong(studentid);
            User u=userMapper.selectByPrimaryKey(stu);
            if(u!=null) {
                arg0.setAttribute("item2", u);
                result = "selected";
            }
            else {
                result="wrong3";
            }
        }
        else if(type.equals("edit")) {
            result = "edit";
        }

        else if(type.equals("edited")) {
            User record=new User();
            String studenttel=arg0.getParameter("studenttel");
            String classid=arg0.getParameter("classid");
            String studentid=arg0.getParameter("studentid");
            record.setStudentid(Long.parseLong(studentid));

            record.setStudenttel(Long.parseLong(studenttel));
            record.setClassid(Integer.parseInt(classid));
            Long stu=Long.parseLong(studentid);
            User u=userMapper.selectByPrimaryKey(stu);
            if(u!=null) {
                userMapper.updateByPrimaryKeySelective(record);
                result ="edited";
            }
            else {
                result="wrong3";
            }
        }
        else if(type.equals("delete")) {
            result="delete";
        }
        else if(type.equals("add")) {
            result="add";
            }
        else if(type.equals("register")) {
            result="register";
            }
        else if(type.equals("registered")) {
            Administrator record=new Administrator();
            String adminid=arg0.getParameter("adminid");
            String adminname=arg0.getParameter("adminname");
            record.setAdminid(Long.parseLong(adminid));
            record.setAdminname(adminname);
            adminMapper.insertSelective(record);
            result="registered";
        }
        else if(type.equals("finish")) {
            Long record;
            String studentid=arg0.getParameter("studentid");
            /*long x=(long)(Math.random()*50);*/
            record=(Long.parseLong(studentid));
            Long stu=Long.parseLong(studentid);
            User u=userMapper.selectByPrimaryKey(stu);
            if(u!=null) {
                userMapper.deleteByPrimaryKey(record);
                result="finish";
            }
            else {
                result="wrong3";
            }
        }
        else if(type.equals("index")) {
            List<User> list=userMapper.selectByExample();
            arg0.setAttribute("item", list);
            result="index";
            }
        else if(type.equals("condition")) {
            String adminid=arg0.getParameter("adminid");
            Long stu=Long.parseLong(adminid);
            Administrator u=adminMapper.selectadminByPrimaryKey(stu);
            if(u!=null) {
                result="welcome";
            }
            else {result="wrong";}

        }

        return result;
    }
}

通过type.equals("xxx")获得url地址,通过result="xxx"对应各自的jsp文件。这里面引用了userMapper和adminMapper两个对象,分别对应项目中学生和管理员两个身份,也对应后面说到的UserMapper接口类和AdminMapper接口类。

/*Spring自动将bean中引用的对象的set和get方法省略,直接自动生成*/
@Autowired
    UserMapper userMapper;
    @Autowired
    AdminMapper adminMapper;

在这两个接口类中声明增减改查的方法,并且需要各自的配置文件,通过Mybatis与数据库连接。
六、接口类
在这个项目中我想实现的功能有:
1、以管理员的身份登陆 2、对学生信息进行增减改查
因此需要两个接口类UserMapper和AdminMapper

package com.mapper;
import java.util.List;


import com.pojo.User;//引入实体类

public interface UserMapper {

    List<User> selectByExample ();//查
    User selectByPrimaryKey (Long id);//查
    int insert(User username);//增
    int insertSelective(User record);//增
    int updateByPrimaryKeySelective(User record);//改
    int deleteByPrimaryKey(Long id);//减
    }

七、实体类
在src下新建com.pojo包,创建User实体类和Administrator实体类,存放各自的set和get方法。

package com.pojo;
public class User {
    private Long studentid;
    private String studentname;
    private Integer studentage;
    private String studentsex;
    private Long studenttel;
    private Integer classid;


    public Long getStudentid() {
        return studentid;
    }
    public void setStudentid(Long studentid) {
        this.studentid = studentid;
    }
    public String getStudentname() {
        return studentname;
    }
    public void setStudentname(String studentname) {
        this.studentname = studentname;
    }
    public Integer getStudentage() {
        return studentage;
    }
    public void setStudentage(Integer studentage) {
        this.studentage = studentage;
    }
    public String getStudentsex() {
        return studentsex;
    }
    public void setStudentsex(String studentsex) {
        this.studentsex = studentsex;
    }
    public Long getStudenttel() {
        return studenttel;
    }
    public void setStudenttel(Long studenttel) {
        this.studenttel = studenttel;
    }
    public Integer getClassid() {
        return classid;
    }
    public void setClassid(Integer classid) {
        this.classid = classid;
    }


}

八、jsp文件
这部分就主要是根据具体想要实现的前端界面来设计了。其中可以包含一些异常处理,比如已经存在了的用户不能再次添加、用户名不能过长或者过短等等。这里就不详细展开了。如果只是想练习后端部分也可以不写jsp文件,改用测试文件也可以。
九、项目总结
用户管理系统算是基于SpringMVC框架中最为简单的实战项目,网路上已经有大量的相关文档可以参考,当然也不止本文中所用到的这种方法。虽然比较简单,但也覆盖了比较广的技术面,使用的也是业界比较成熟和流行的技术,欢迎大家参考和指正。

展开阅读全文

没有更多推荐了,返回首页