目录
初步完成一个医疗信息系统的系统框架,设计简单功能:
1)完成用户登录模块,并实现用户密码修改功能,运行查看其结果;
2)完成用户管理模块,实现查询用户功能,运行查看其结果;
3) 完成部分功能的增删查改;
因为时间关系,目前只实现了用户登录、退出登录、修改密码、用户管理中查询与用户信息添加、药品信息管理--查询、科室管理--查询、会员管理查询;只展示部分代码模块
在实现功能之前,了解SSM框架各层资源包:
在 SSM(Spring + Spring MVC + MyBatis)框架中,资源包通常采用分层的结构来存储不同类型的组件。下面是不同资源包的含义及其存储的内容:
- 1. Controller层:存储应用程序的控制器,负责处理请求和响应
- 2. mapper.Java:存储MyBatis的Mapper接口,提供了访问数据库操作的方法
- 3. mapper.xml:存储MyBatis的映射文件,提供Java类和SQL语句之间的映射
- 4. pojo:存储数据对象,即Java类,通常与数据库中的表相对应
- 5. Service:存储服务层组件,提供业务逻辑的实现
- 6. ServiceImpl:存储服务层的实现类,实现Service接口提供的业务逻辑
实现:
实现用户管理中的用户添加功能
在Controller层中的UserController中设置一个方法名为insertUserssm,其功能是实现其作用是将传入的HttpServletRequest对象中的id,username,password等参数值提取出来,并将这个值设置到Userssm1对象的id,username,password属性中,最终返回更新后的Userssm1对象
该方法接收两个参数:HttpServletRequest类型的request对象和Userssm1类型的userssm对象.其作用方式如id:它首先通过request.getParameter("id")方法从请求中获取id参数值(以字符串形式),然后调用userssm.setId()方法将其设置到Userssm1对象的id属性中。最后,方法返回更新后的Userssm1对象;
再在Controller层中设置一个Spring MVC的控制器方法。当用户访问路径为“/addUserList”的页面并提交表单数据时,该方法将被调用。该方法使用HttpServletRequest对象来从HTTP请求中获取信息,并使用@ModelAttribute注释来将表单数据绑定到Userssm1对象。然后它通过调用名为insertUserssm的私有方法来插入新的Userssm1对象,并使用MyBatis持久性层框架将其插入数据库中.最后,该方法返回字符串“adminList”,以便将用户重定向到管理列表页面.
public Userssm1 insertUserssm(HttpServletRequest request, Userssm1 userssm) {
userssm.setId(request.getParameter("id"));
userssm.setUsername(request.getParameter("username"));
userssm.setPassword(request.getParameter("password"));
userssm.setRealname(request.getParameter("realname"));
userssm.setRole(request.getParameter("role"));
userssm.setAge(request.getParameter("age"));
userssm.setTel(request.getParameter("tel"));
userssm.setAddress(request.getParameter("address"));
return userssm;
}
@RequestMapping(value = "/addUserList")
public String addUserList(HttpServletRequest request,
@ModelAttribute("userssm1") Userssm1 userssm){
Userssm1 userssm1 = insertUserssm(request, userssm);
SqlSession openSession = sqlSessionFactory.openSession();
Userssm1Mapper mapper = openSession.getMapper(Userssm1Mapper.class);
mapper.insert(userssm1);
openSession.close();
return "adminList";
}
在Userssm1Mapper.java中将int insert(Userssm1 record);改为void类型不需要返回值;
void insert(Userssm1 record);
在pojo资源包中添加user对象属性:
package com.inspur.ssm.pojo;
import java.math.BigDecimal;
import java.sql.Date;
public class Userssm1 {
private String id;
private String username;
private String password;
private String role;
private String realname;
private String tel;
private String age;
private String sex;
private String address;
private Date createdate;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username == null ? null : username.trim();
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password == null ? null : password.trim();
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role == null ? null : role.trim();
}
public String getRealname() {
return realname;
}
public void setRealname(String realname) {
this.realname = realname == null ? null : realname.trim();
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel == null ? null : tel.trim();
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex == null ? null : sex.trim();
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address == null ? null : address.trim();
}
public Date getCreatedate() {
return createdate;
}
public void setCreatedate(Date createdate) {
this.createdate = createdate;
}
}
在UserService层封装一个应用程序的业务逻辑,插入数据的方法进行封装
@Resource
public interface UserService {
void insert(Userssm1 record);
}
在UserServiceImpl中对UserService中的插入方法进行实现;在 UserServiceImpl 层中,可以调用 DAO 层提供的方法获取需要的数据,并对这些数据进行处理和业务逻辑的实现
@Service("userService")
public class UserServiceImpl implements UserService{
@Autowired
private Userssm1Mapper userssm1Mapper;
@Override
public void insert(Userssm1 record) {
// TODO Auto-generated method stub
return ;
}
}
在jsp中创建一个名为adminadd.jsp页面,使用组件进行代码;在<form>标签的action属性中指定将在表单提交时向其发送数据的服务器端页面的URL地址为${ctx}/user/addUserList.action,当用户提交表单时,数据将被发送到 ${ctx}/user/addUserList.action 这个URL上.然后由服务端处理这些数据,并做出相应的响应.
<div id="contentWrap">
<!--表格控件 -->
<div id="widget table-widget">
<div class="pageTitle">用户管理</div>
<div class="querybody" >
<form name="queryForm" action="${ctx}/user/queryUserList.action" method="post">
<ul class="seachform" >
<li><label>用户ID</label><input id="id" name="id" type="text" value="${userssm.id}" class="scinput" /></li>
<li><label>用户名称</label><input id="username" name="username" type="text" value="${userssm.username}" class="scinput" /></li>
<li><label>用户类型</label>
<select id="role" name="role" style="width:150px;height:32px;" >
<c:forEach items="${roleList}" var="role" >
<option value="${role.BM}" <c:if test="${userssm.role eq role.BM}">selected</c:if>>${role.MC}</option>
</c:forEach>
</select>
</li>
<li><label> </label><input type="submit" class="scbtn" value="查询" /></li>
</ul>
</form>
</div>
<div class="pageColumn">
<div class="pageButton"><a href="${ctx}/jsp/adminadd.jsp"><img src="${ctx}/images/t01.png" title="新增"/></a><span>用户列表</span></div>
<table>
<thead>
<th width="">用户ID</th>
<th width="">用户名</th>
<th width="">姓名</th>
<th width="">用户类型</th>
<th width="">联系电话</th>
<th width="">年龄</th>
<th width="">家庭住址</th>
<th width="10%">操作</th>
</thead>
<tbody>
<c:forEach items="${userList}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.username}</td>
<td>${user.realname}</td>
<td>${user.role eq 01 ? "管理员":user.role eq 02 ? "大堂服务员": user.role eq 03 ? "药剂师": "未知"}</td>
<td>${user.tel}</td>
<td>${user.age}</td>
<td>${user.address}</td>
<td><a onclick="modify(id)"><img src="${ctx}/images/icon/edit.png" width="16" height="16" /></a>
<a onclick="deletes(id)"><img src="${ctx}/images/icon/del.png" width="16" height="16" /></a></td>
</tr>
</c:forEach>
</tbody>
</table>
<jsp:include page="common/includefoot.jsp">
<jsp:param name="url" value="/user/queryUserList.action" />
</jsp:include>
</div>
</div><!-- #widget -->
</div>
药品信息管理--查询
创建一个Java Spring MVC 的控制器类,名为 DruController继承了PageController类.使用@Controller 注解表示这是一个控制器类,负责处理前端请求并返回响应.@RequestMapping("/Dru") 注解指定了该控制器下所有处理请求的URL前缀为 "/Dru";该类使用了@Autowired注解注入了一个DruService对象.该类中有一个名为queryDruList的方法,使用了@RequestMapping注解,用于处理请求路径为"/queryDruList"的请求.该方法中首先调用了CommonUtil类的getCode方法获取系统角色列表,然后根据前端传递的查询条件,调用druService的getCounts方法获取符合条件的记录总数,并根据记录总数设置了分页对象.接着根据前端传递的排序条件,调用druService的getDruList方法获取符合条件的药品列表,并将结果集存入request中,最后返回"yplist"字符串,表示使用名为yplist的JSP页面进行展示;
@Controller //注解表示这是一个控制器类
@RequestMapping("/Dru") //注解指定了该控制器下所有处理请求的URL前缀为 "/Dru"
public class DruController extends PageController {
@Autowired //注解注入了一个DruService对象
private DruService druService;
@RequestMapping("/queryDruList")
public String findDruList(HttpServletRequest request,@ModelAttribute("drugs") Drugs drugs) {
List<Map<String, Object>> roleList = CommonUtil.getCode("system_role", true, "asc");
Map<String,Object> params = new HashMap<String,Object>();
//添加查询条件
params.put("drugsid",drugs.getDrugsid());
if(!StringUtil.isEmptyString(drugs.getName())) {
params.put("name", drugs.getName());
}
//获取总条数
Long totalCount = druService.getCounts(params);
//设置分页对象
Page page = executePage(request,totalCount);
//如排序
if(page.isSort()){
params.put("orderName",page.getSortName());
params.put("descAsc",page.getSortState());
}else{
//没有进行排序,默认排序方式
params.put("orderName","id");
params.put("descAsc","desc");
}
//压入查询参数:开始条数与结束条灵敏
params.put("startIndex", page.getBeginIndex());
params.put("endIndex", page.getEndinIndex());
//查询集合
List<Drugs> Drug = druService.getDruList(params);
request.setAttribute("druList", Drug);
request.setAttribute("roleList", roleList);
return "yplist";
}
}
创建一个名为“DrugsMapper”的Java接口,它定义了两个方法:
getDruList(Map<String,Object> params)——这个方法根据给定的参数返回drug对象的列表。Map<String, Object>参数允许向查询传递多个参数,该方法将返回符合指定条件的drug对象列表.
getCounts(Map<String,Object> p)——该方法接受Map对象作为参数,并根据指定的搜索条件返回记录的总数。通过确定需要在每个页面上显示的记录数量,并计算显示所有结果所需的总页数,可以使用它来实现分页功能.
public List<Drugs> getDruList(Map<String,Object> params);
//分页总条数
public Long getCounts(Map<String,Object> p);
创建一个名为"DruService"的接口,包含两个方法:
getDruList: 该方法返回药物列表(List<Drugs>),其中参数params是一个java.util.Map类型的对象,用于传递查询条件.
getCounts: 该方法返回满足查询条件的药物总条数(Long)。其中参数p也是一个java.util.Map类型的对象,用于传递查询条件.
public interface DruService {
public Long getCounts(Map<String, Object> params);
public List<Drugs> getDruList(Map<String, Object> params);
}
创建一个DruServiceImpl,它实现了一个接口DruService。 @Service("druService")注解指定了这个类是一个服务,且其在IOC容器中的名称为"druService".
这个类使用了注解@Autowired注入了一个名为drugsMapper的依赖项。该DrugsMapper 是一个数据访问对象(DAO),用于从数据库中获取药品信息的查询.
getCounts和getDruList 两个方法是DruService 接口中定义的抽象方法,该类重写了这些方法并提供了具体实现,其中调用了Dao层的方法来执行操作.
@Service("druService")
public class DruServiceImpl implements DruService {
@Autowired
private DrugsMapper drugsMapper;
@Override
public Long getCounts(Map<String, Object> params) {
// TODO 自动生成的方法存根
return drugsMapper.getCounts(params);
}
@Override
public List<Drugs> getDruList(Map<String, Object> params) {
// TODO 自动生成的方法存根
return drugsMapper.getDruList(params);
}
}
在”DrugsMapper.xml”中实现sql语句:
<sql id="query_user_where">
<if test="drugsid!='' and drugsid != null">
and t.drugsid like '%${drugsid}%'
</if>
<if test="name != '' and name != null">
and t.name like '%${name}%'
</if>
</sql>
<select id="getCounts" resultType="long" parameterType="java.util.HashMap">
select count(*) from drugs t
<where>
<include refid="query_user_where"></include>
</where>
</select>
<select id="getDruList" resultType="java.util.List" resultMap="BaseResultMap" parameterType="java.util.HashMap">
<!-- include refid="com.inspur.ssm.mapper.CommonMapper.pagingTop"></include> -->
select * from drugs t
<where>
<include refid="query_user_where"></include>
</where>
<!-- <include refid="com.inspur.ssm.mapper.CommonMapper.pagingBottom"></include>-->
</select>
<sql id="query_user_where">...</sql>:定义一个 SQL 片段,ID 为 query_user_where。
<if test="drugsid!='' and drugsid != null">...</if>:如果 drugsid 不为空或不为 null,就加入一个过滤条件,其值包含指定的 drugsid.
<if test="name != '' and name != null">...</if>:如果 name 不为空或不为 null,就加入一个过滤条件,其值包含指定的 name.
所以,该查询语句的作用是:根据输入的 drugsid 和 name 条件筛选用户信息,并返回符合筛选条件的结果.这是一种动态拼接 SQL 查询语句的方式.
查询数据库中名为"drugs"的表中符合特定条件的数据行数。条件是通过使用名为 "query_user_where" 的地方引用内的查询语句来指定的。这一查询操作使用一个名为"getCounts" 的标识符进行定义,该标识符是一个使用Java HashMap作为参数类型,并返回长整型数值的 SQL 查询语句。具体而言,它将返回符合特定条件的数据行的总数(即计数)
从数据库中查询药品列表.
id="getDruList":定义了此查询语句的标识符.
resultType="java.util.List":定义了结果类型为java.util.List列表.
resultMap="BaseResultMap":该查询语句将使用BaseResultMap映射结果到药品实体类.
parameterType="java.util.HashMap":指定传递给该查询语句的参数类型为java.util.HashMap.
<where>和</where>之间包含一个<include>元素,引用了一个名为query_user_where的外部SQL片段,用于构建WHERE子句来过滤药品.
SQL查询语句: select * from drugs t where ... 输出所有药品( t是别名 );
最后:
在jsp资源包中添加jsp页面命名为”yplist.jsp”
在这个JSP页面中使用<c:forEach>标签,用于循环遍历druList集合中的每个元素,并将每个元素的属性值显示在表格中的每一列中。具体来说,代码中的items属性指定了要遍历的集合为druList,var属性指定了当前遍历的元素名为dru。在循环体中,使用EL表达式{dru.drugsid}、dru.drugsid、{dru.name}等获取了dru对象的各个属性值,并将其分别显示在表格的不同列中
<div id="contentWrap">
<!--表格控件 -->
<div id="widget table-widget">
<div class="pageTitle">药品管理</div>
<div class="querybody">
<form name="queryForm" action="${ctx}/Dru/queryDruList.action" method="post">
<ul class="seachform" >
<li><label>药品ID</label><input name="drugsid" type="text" class="scinput" /></li>
<li><label>药品名称</label><input name="name" type="text" class="scinput" /></li>
<li><label> </label><input name="" type="submit" class="scbtn" value="查询"/></li>
</ul>
</form>
</div>
<div class="pageColumn">
<div class="pageButton"><a href="ypAdd.html"><img src="../images/t01.png" title="新增"/></a><span>药品列表</span></div>
<table>
<thead>
<th width="">药品ID</th>
<th width="">药品名称</th>
<th width="">进价</th>
<th width="">售价</th>
<th width="">库存数量</th>
<th width="">引入日期</th>
<th width="">生产厂商</th>
<th width="">生产日期</th>
<th width="">保质期</th>
<th width="">供货单位</th>
<th width="10%">操作</th>
<th width="10%">库存新增</th>
</thead>
<tbody>
<c:forEach items="${druList}" var="dru">
<tr>
<td>${dru.drugsid}</td>
<td>${dru.name}</td>
<td>${dru.purchaseprice}</td>
<td>${dru.price}</td>
<td>${dru.num}</td>
<td>${dru.introducedate}</td>
<td>${dru.productunit}</td>
<td>${dru.productdate}</td>
<td>${dru.qualityperiod}</td>
<td>${dru.supplyunit}</td>
<td><a onclick="modify(id)"><img src="${ctx}/images/icon/edit.png" width="16" height="16" /></a>
<a onclick="deletes(id)"><img src="${ctx}/images/icon/del.png" width="16" height="16" /></a></td>
<td><a onclick=""><img src="${ctx}/images/icon/edit2.png" width="16" height="16" /></td>
</tr>
</c:forEach>
</tbody>
</table>
<jsp:include page="common/includefoot.jsp">
<jsp:param value="/user/queryMemList.action" name="url"/>
</jsp:include>
</div>
</div><!-- #widget -->
</div>
总结
本次实验主要是使用SSM框架(Spring+SpringMVC+Mybatis)开发医疗信息系统,通过实践掌握SSM框架的使用和应用,同时深入了解医疗信息系统的设计和开发。
在实验中,我首先进行了系统的需求分析和设计,明确了系统的功能模块和流程,确定了系统的数据库设计和数据表结构。然后,我使用Maven构建了项目,并引入了SSM框架的相关依赖。
接着,我使用Spring框架搭建了系统的核心容器,并配置了SpringMVC框架的DispatcherServlet,实现了请求的转发和响应。同时,我使用Mybatis框架进行数据持久化操作,实现了对数据库的增删改查等操作。
在实现具体功能模块时,我采用了面向对象的编程思想,使用Java语言编写了相应的业务逻辑代码,并进行了测试和调试,确保系统的稳定性和可靠性。
最后,我对整个系统进行了部署和调试,并进行了性能测试和优化,确保系统的高效性和可扩展性。
通过本次实验,我深入了解了SSM框架的使用和应用,掌握了医疗信息系统的设计和开发方法,提高了自己的编程能力和实践经验。