用户管理功能的流程是:
1.管理功能会通过struts跳转到UserManager的Action,(spring帮助注入实例)
2.UserManagerAction里边聚合了ManagerService实例(也是spring的功劳),调用里边的增删改查的方法
3.ManagerService实例直接调用dao中增删改查的具体实现的方法
4.这些具体实现,通过spring管理的getSqlMapClientTemplate(),直接控制iBatis
5. iBatis去查找相应的mapping配置,读写数据库
1.UserManagerAction
聚合了一个UserManagerService实例,调用里边增删改查的实现方法:
public class UserManagerAction extends ActionSupport
{
private String username;
private String password;
private IUserManager service;
public UserManagerAction()
{
}
public String queryall()
{
List<User_SSI> list = service.queryall();
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("user", list);
return SUCCESS;
}
public String register()
{
boolean flag = false;
flag = service.register(getUsername(), getPassword());
return flag==true?SUCCESS:ERROR;
}
public String update()
{
HttpServletRequest request = ServletActionContext.getRequest();
String username = request.getParameter("username");
boolean flag = false;
System.out.println("username=>"+username);
System.out.println("getusername()=>"+getUsername());
flag = service.update(username, getPassword());
return flag==true?SUCCESS:ERROR;
}
public String delete()
{
HttpServletRequest request = ServletActionContext.getRequest();
String username=request.getParameter("username");
boolean flag = false;
flag = service.delete(getUsername());
return flag==true?SUCCESS:ERROR;
}
//setter&getter
}
2.ManagerService
聚合了dao实例,实现分层
直接传给dao一个vo的实例,这调试时候出了一个错误:应该完全依靠spring来注入vo,自己在service里new出来的vo可能会出错
public class ManagerService implements IUserManager
{
private User_SSI user;
private IUserDao dao;
public User_SSI getUser() {
return user;
}
public void setUser(User_SSI u) {
this.user = u;
}
public void setDao(IUserDao dao) {
this.dao = dao;
}
public IUserDao getDao() {
return dao;
}
public List<User_SSI> queryall()
{
List<User_SSI> l1 = dao.queryUser();
return l1;
}
public boolean register(String username, String password)
{
user.setUsername(username);
user.setPassword(password);
dao.insertUser(user);//出过一个NullPointer异常,是因为在这里不能新new一个User,要依赖于Spring注入
return true;
}
public boolean update(String username, String password)
{
user.setUsername(username);
user.setPassword(password);
return dao.updateUser(user);
}
public boolean delete(String username)
{
return dao.deleteUser(username);
}
}
3.UserDaoImpl
ibatis去读配置的任务交给spring了,这里引入 SqlMapClientDaoSupport后直接调用template
省了不少事
相应的,ibatis应该读到的信息要配置到spring中才行
这里执行具体实现时候加了一个命名空间user,这项配置还是ibatis负责的
public class UserDaoImpl extends SqlMapClientDaoSupport implements IUserDao {
/*这儿不用手动初始化了,等着spring注入完直接用
* spring会往service里,注入一个带dataSource和ibatis配置的dao
*
private static SqlMapClient sqlMap;
void init() {
try {
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");//借助Reader读入xml配置,注意位置
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (IOException e) {
// Fail fast.
throw new RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);
}
}
*/
public List<User_SSI> queryUser() {
List<User_SSI> list = null;
list = getSqlMapClientTemplate().queryForList("User.getAllUser");
return list;
}
public boolean deleteUser(String id) {
int deletedCount = 0;
deletedCount = getSqlMapClientTemplate().delete("User.deleteUserById",id);
return deletedCount>0?true:false;
}
public void insertUser(User_SSI u) {
int insertCount = 0;
getSqlMapClientTemplate().insert("User.insertUser",u);
}
public boolean updateUser(User_SSI u) {
int updatedCount = 0;
updatedCount = getSqlMapClientTemplate().update("User.updateUser",u);
System.out.println("updatedCount=>"+updatedCount);
return updatedCount>0?true:false;
}
public List<User_SSI> queryUserName(String name) {
List<User_SSI> list = null;
list = getSqlMapClientTemplate().queryForList("User.selectUserByUsername",name);
return list;
}
}
4.iBatis对于User的映射文件
这个没什么说的,ibatis的本职工作,整合以后不改变
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="User">
<typeAlias alias="User" type="vo.User_SSI"/><!-- 别名 -->
<resultMap id="UserResult" class="User">
<result property="username" column="username" />
<result property="password" column="password" />
</resultMap>
<select id="getAllUser" resultClass="User" parameterClass="string">
SELECT * FROM User_SSI
</select>
<select id="selectUserByUsername" parameterClass="string" resultClass="User">
select
username,
password
from User_SSI
where username = #username#
</select>
<insert id="insertUser" parameterClass="User">
insert into User_SSI (
username,
password)
values (
#username#, #password#
)
</insert>
<update id="updateUser" parameterClass="User">
update User_SSI set
password = #password#
where
username = #username#
</update>
<delete id="deleteUserById" parameterClass="string">
delete from User_SSI where username = #username#
</delete>
</sqlMap>
5.显示用的jsp
管理窗口负责:修改和删除
点修改图标时,弹出一个新窗口操作,
修改完之后,由弹出的窗口来刷新此页面(刷新父页面)
<form action="#" id="myform" name="myform" method="post">
<table border=1 width="80%">
<tr>
<th width="39%">用户名</th>
<th width="39%">密码</th>
<th>修改</th>
<th>删除</th>
</tr>
<tr>
<s:iterator value="#request.user" id="id"status="st">
<s:if test="#st.index%2==0||#st.last">
<tr>
</s:if>
<td><s:property value="#id.username" /></td>
<td><s:property value="#id.password" /></td>
<td><input style="width: 40px; height: 40px" name="button"
type="button" class="class1" onMouseOver="this.className='class2'"onMouseOut="this.className='class1'"
onClick="window.open('update.jsp?username=<s:property value="#id.username" />&password=<s:property value="#id.password" />','new','height=500,width=800,top=100,left=400')"
value="修改" /></td>
<td><input style="width: 40px; height: 40px" name="button"
type="button" class="class3" onMouseOver="this.className= 'class4'"onMouseOut="this.className= 'class3'"
οnclick="doLink('delete?username=<s:property value="#id.username" />')"
value="删除" /></td>
<s:if test="#st.index%2==0||#st.last">
</tr>
</s:if>
</s:iterator>
</tr>
</table>
</form>
修改之后的结果
这是个弹窗,要刷新一下父页面,不然他自己关了以后,父页面的数据还要手动刷新才能一致
<body>
<h2>操作成功</h2>
<!-- 刷新父窗口 -->
<script language="Javascript">
opener.location.reload();
</script>
<a href=javascript:window.opener=null;window.close()>关闭本窗口</a>
</body>