最近一直想找点事情做,前几个星期马原老师说要做一份社会调查需要用到调查问卷,然后基本都是网上直接用现成的网站直接做的,我在想自己是不是也能做一个类似简单的管理系统呢。。然后一做就做了半个月,前几天总算是做好了,感觉要是自己勤快一点可能几天就能写好吧,下面是我在写这个调查系统的全部过程和遇到的问题解决方法。
首先是在脑海中构建整个系统的模型,我是喜欢根据这个模型先写好数据库的脚本,然后再写用到的POJO,和数据库相连接的sql类和mybatis的配置文件,最后将这些东西在jsp页面中拼接起来,SpringMVC算是一个粘合剂将这些东西很好的组合在一起。
我的构想:
首先和其他系统一样,应该先有一个账号以便起到多个人使用时使数据分开标识的作用,那么就应该有登录界面和注册账号页面。。这个很简单,随便搞搞就好了。
那么来到管理者的主界面,应该有创建问卷,查看/进行问卷调查,和查看问卷调查结果的功能,到这里,这个系统的大致模型已经有了。
再细想,数据库的数据表,首先应该有存放用户账号密码的表,叫user吧,其次应该有一张存放题目信息的表,叫inf吧,然后就是应该再有一张存放对应题目选项的表,叫det,然后每张表里面的数据就按照意思建就好了。
然后对应每张表,POJO类应该也有三个。。为了偷懒我直接都叫了表的名字。
下面是我mysql建表的脚本代码:
create database users;
use users;
create table user(
username varchar(10) primary key,
pwd varchar(20)
);
create table inf(
num int,
username varchar(10),
des varchar(200),
foreign key(username) references user(username)
);
create table det(
num int,
id int,
opt varchar(30),
username varchar(10),
value int default '0',
foreign key(username) references user(username)
);
我的num是存题目的编号,id是存选项的编号。
然后就可以开始写POJO的java代码了,还有相应的sql语句,由于整个工程涉及的代码太多,就不一一放上来了,就挑一些重要的放,然后整个工程代码附上github的网址:https://github.com/iunique/IdeaProject。
项目基本骨架:
简介:
Dao放着和数据库相连接的代码,entity里放这POJO类,handles里面放的是页面控制器,用于处理页面映射以及起到servlet的作用,处理请求,跳转页面,config.xml放mybatis的基本配置文件,tab.xml放着sql语句,页面我用到的很多,登录界面login,注册界面register,还有相应的登录和注册判断跳转页面,然后index是用户主界面,对应着三个功能的界面,建调查问卷,进行问卷调查,查看调查文件结果。
先记录一下过程中遇到的几大问题:
1.中文乱码问题
2.WEB-INF目录下限制访问问题
3.算法问题,也就是如何用代码实现整个系统
解决方法:
1.中文乱码算是困扰我最久的问题,因为需要改的地方有很多,mysql数据库存储时的编码,解码设置,jsp页面编码解码的设置,以及mybatis配置文件中编码设置,在java代码处理数据时的编码解码设置。。只有全部搞好了才能实现中文在页面中的正常读取和呈现,少一步都不行,因为平时不用中文读取和呈现,基本没发现还有这么大的一个问题。。然后为此搞了一天最后写了博客:https://blog.youkuaiyun.com/qq_37497322/article/details/80034487
2.出于安全性考虑,jsp文件最好放在限制访问的WEB-INF目录下,
不用springMVC解决方法:https://blog.youkuaiyun.com/qq_37497322/article/details/80027464
一开始我是没用springMVC的,全部是用上面的方法+大量的web.xml配置映射+十几个servlet。。。代码量大大增加而且很复杂,最后我还是屈服了,花了一两天把代码改成了springMVC版的,映射文件和servlet全交给Controller处理。。才体会到了springMVC的强大,还有自带的表单自动填补POJO类的功能。。。简直不要太强
3.这个问题感觉是长期积累的代码感觉。。。想了一会实现方法,就写出来了,这东西感觉不好表达,或许是一年多的acm经验带来的加成吧,下面贴代码
首先是我的config.xml,也就是mybatis的配置文件,需要注意连接的时候加上字符集,url处最后加上
useUnicode=true&characterEncoding=UTF-8
的字样可以解决写入数据库时的编码问题:
<?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>
<!-- 和Spring整合后environment配置都会被干掉 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理,目前由mybatis来管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池,目前由mybatis来管理 -->
<dataSource type="POOLED"><!--有关于mysql数据库的各种信息-->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/users?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root" />
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--将操作配置文件User.xml系添加进mapper-->
<mapper resource="tab.xml" />
</mappers>
</configuration>
然后是tab.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="dom">
<resultMap type="entity.det" id="det">
<result column="num" property="num" javaType="int"/>
<result column="id" property="id" javaType="int"/>
<result column="opt" property="opt" javaType="string"/>
<result column="value" property="value" javaType="int"/>
<result column="username" property="username" javaType="string"/>
</resultMap>
<resultMap type="entity.user" id="user">
<result column="username" property="username" javaType="string"/>
<result column="pwd" property="pwd" javaType="string"/>
</resultMap>
<resultMap type="entity.inf" id="inf">
<result column="num" property="num" javaType="int"/>
<result column="username" property="username" javaType="string"/>
<result column="des" property="des" javaType="string"/>
</resultMap>
<!--查询用户是否存在-->
<select id="findUser" parameterType="java.lang.String" resultType="java.lang.Integer">
select COUNT(*) from user where username = '${value}'
</select>
<!--返回用户密码-->
<select id="findPwd" parameterType="java.lang.String" resultType="java.lang.String">