一、项目介绍
构建学生管理系统,实现增减改查功能。
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配置
<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>contextConfigLocationparam-name>
<param-value>WEB-INF/applicationContext-*.xmlparam-value>
context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>
<servlet>
<servlet-name>springservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>WEB-INF/springmvc.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>springservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
<filter>
<filter-name>encodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
<init-param>
<param-name>forceEncodingparam-name>
<param-value>trueparam-value>
init-param>
filter>
<filter-mapping>
<filter-name>encodingFilterfilter-name>
<url-pattern>*.dourl-pattern>
filter-mapping>
web-app>
其中比较重要的是DispatcherServlet的配置。
B、springmvc.xml配置
在WEB-INF 下创建 springmvc.xml (名称(spring)和 web.xml 中配置的
中的 spring 名称要对应)
<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">
<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中配置
自动注册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
<configuration>
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="oracle"/>
plugin>
plugins>
configuration>
(3)applicationContext-dao.xml
其中数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
<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>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="WEB-INF/SqlMapConfig.xml">property>
<property name="dataSource" ref="dataSource">property>
bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mapper">property>
bean>
beans>
3、接口类配置
UserMapper.xml和AdminMapper.xml对应后面说到的两个接口类,配置文件中定义了增减改查方法。
<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 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框架中最为简单的实战项目,网路上已经有大量的相关文档可以参考,当然也不止本文中所用到的这种方法。虽然比较简单,但也覆盖了比较广的技术面,使用的也是业界比较成熟和流行的技术,欢迎大家参考和指正。