我是用ssh做的,当然,这部分只涉及到spring,而且我觉得可能跟spring 的关系也不大吗,不多说,上代码和图
(我的问题是:为什么UserAction里面可以直接指向UserService这个接口的方法呢?)
// 查询
User user = userService.getStuNumberAndPassword(model.getStuNumber(), model.getPassword());)
这是结构图:
UserAction:
package com.hxw.oa.view.action; import com.hxw.oa.base.BaseAction; import com.hxw.oa.domain.User; import com.opensymphony.xwork2.ActionContext; public class UserAction extends BaseAction<User>{ /** 登录 */ public String login() throws Exception { // 查询 User user = userService.getStuNumberAndPassword(model.getStuNumber(), model.getPassword()); if (user == null) { addFieldError("login", "用户或密码不正确"); return "loginUI"; } else { // 正确就登录用户 ActionContext.getContext().getSession().put("user", user); return "toIndex"; } } }
UserServiceImpl:
package com.hxw.oa.service.impl; import org.apache.commons.codec.digest.DigestUtils; import com.hxw.oa.base.BaseDaoImpl; import com.hxw.oa.domain.User; import com.hxw.oa.service.UserService; public class UserServiceImpl extends BaseDaoImpl<User> implements UserService{ @Override public User getStuNumberAndPassword(String stuNumber, String password) { return (User) getSession().createQuery(// "FROM User u WHERE u.stuNumber=? AND u.password=?")// .setParameter(0, stuNumber)// .setParameter(1, DigestUtils.md5Hex(password))// 要使用MD5的摘要 .uniqueResult(); } }
UserService接口:
package com.hxw.oa.service; import com.hxw.oa.base.BaseDao; import com.hxw.oa.domain.User; public interface UserService extends BaseDao<User>{ User getStuNumberAndPassword(String stuNumber, String password); }
BaseAction:
package com.hxw.oa.base; import java.lang.reflect.ParameterizedType; import javax.annotation.Resource; import com.hxw.oa.domain.User; import com.hxw.oa.service.UserService; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T> { // @Resource // protected RoleService roleService; // @Resource // protected DepartmentService departmentService; @Resource protected UserService userService; // @Resource // protected PrivilegeService privilegeService; // // @Resource // protected ForumService forumService; // @Resource // protected TopicService topicService; // @Resource // protected ReplyService replyService; protected T model; public BaseAction() { try { // 得到model的类型信息 ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass(); Class clazz = (Class) pt.getActualTypeArguments()[0]; // 通过反射生成model的实例 model = (T) clazz.newInstance(); } catch (Exception e) { throw new RuntimeException(e); } } public T getModel() { return model; } /** * 获取当前登录的用户 * * @return */ protected User getCurrentUser() { return (User) ActionContext.getContext().getSession().get("user"); } // 页码默认为第1页 protected int pageNum = 1; public int getPageNum() { return pageNum; } public void setPageNum(int pageNum) { this.pageNum = pageNum; } }
BaseDao:
package com.hxw.oa.base; import java.util.List; import com.hxw.oa.domain.PageBean; public interface BaseDao<T> { /** * 保存实体 * * @param entity */ void save(T entity); /** * 删除实体 * * @param id */ void delete(Long id); /** * 更新实体 * * @param entity */ void update(T entity); /** * 查询实体,如果id为null,则返回null,并不会抛异常。 * * @param id * @return */ T getById(Long id); /** * 查询实体 * * @param ids * @return */ List<T> getByIds(Long[] ids); /** * 查询所有 * * @return */ List<T> findAll(); /** * 公共的查询分页信息的主法 * * @param pageNum * @param queryListHQL * 查询数据列表的HQL语句,如果在前面加上“select count(*) ”就变成了查询总数量的HQL语句了 * * @param parameters * 参数列表,顺序与HQL中的'?'的顺序一一对应。 * @return */ PageBean getPageBean(int pageNum, String queryListHQL, Object[] parameters); }
BaseDaoImpl:
package com.hxw.oa.base; import java.lang.reflect.ParameterizedType; import java.util.Collections; import java.util.List; import javax.annotation.Resource; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.transaction.annotation.Transactional; import com.hxw.oa.cfg.Configuration; // @Transactional注解可以被继承,即对子类也有效 @Transactional @SuppressWarnings("unchecked") public abstract class BaseDaoImpl<T> implements BaseDao<T> { @Resource private SessionFactory sessionFactory; protected Class<T> clazz; // 这是一个问题! public BaseDaoImpl() { // 通过反射得到T的真实类型 ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass(); this.clazz = (Class) pt.getActualTypeArguments()[0]; System.out.println("clazz = " + clazz.getName()); } public void save(T entity) { getSession().save(entity); } public void update(T entity) { getSession().update(entity); } public void delete(Long id) { Object obj = getSession().get(clazz, id); getSession().delete(obj); } public T getById(Long id) { if (id == null) { return null; } return (T) getSession().get(clazz, id); } public List<T> getByIds(Long[] ids) { if (ids == null || ids.length == 0) { return Collections.EMPTY_LIST; } return getSession().createQuery(// "FROM " + clazz.getSimpleName() + " WHERE id IN(:ids)")// .setParameterList("ids", ids)// .list(); } public List<T> findAll() { return getSession().createQuery(// "FROM " + clazz.getSimpleName())// .list(); } // 公共的查询分页信息的方法 public com.hxw.oa.domain.PageBean getPageBean(int pageNum, String queryListHQL, Object[] parameters) { System.out.println("--------------> BaseDaoImpl.getPageBean()"); int pageSize = Configuration.getPageSize(); // 查询本页的数据列表 Query listQuery = getSession().createQuery(queryListHQL); if (parameters != null && parameters.length > 0) { // 设置参数 for (int i = 0; i < parameters.length; i++) { listQuery.setParameter(i , parameters[i]); } } listQuery.setFirstResult((pageNum - 1) * pageSize); listQuery.setMaxResults(pageSize); List list = listQuery.list(); // 执行查询 // 查询总记录数 Query countQuery = getSession().createQuery("SELECT COUNT(*) " + queryListHQL); if (parameters != null && parameters.length > 0) { // 设置参数 for (int i = 0; i < parameters.length; i++) { countQuery.setParameter(i, parameters[i]); } } Long count = (Long) countQuery.uniqueResult(); // 执行查询 return new com.hxw.oa.domain.PageBean(pageNum, pageSize, list, count.intValue()); } /** * 获取当前可用的Session * * @return */ protected Session getSession() { return sessionFactory.getCurrentSession(); } }
相关推荐
5. **实现IDispatch接口**:尽管MFC没有提供现成的IDispatch接口实现,但可以使用ATL的IDispatchImpl类作为基础,或者手动实现GetIDsOfNames、Invoke等方法。GetIDsOfNames用于根据名称查找DISPID,Invoke则负责实际...
书中提到,一个良好的接口设计需要简洁明了,对于那些对设计接口感兴趣的程序员来说,这本书提供了一个很好的参考手册。每一章不仅介绍了接口的概念,还包括了实现这些接口的代码。作者通过具体的示例来说明如何构建...
2. **实现方式不同**:一个类可以实现多个接口,但只能直接继承一个父类。 3. **访问修饰符限制不同**:接口中的方法默认都是`public`的,而继承中的方法可以根据需求设置不同的访问级别。 4. **抽象程度不同**:...
该方法首先对FPGA内部的I/O组件进行深入分析,并以此为基础,设计出能够动态改变输出延时的PHY接口和超低延时的高速接口。通过仿真验证了该方法的有效性,进而提出了使用原语实现低延时DDR SDRAM高速数据接口的方案...
具体方法是指已经实现了方法体的方法,可以直接使用。在抽象类中,可以有属性、抽象方法和具体方法。 在抽象类中,如果方法名前面没有“abstract”关键字,那么此方法就一定要有方法体。抽象类中可以有具体的方法...
这种方式可以确保一个接口不仅提供自己的方法,还可以访问嵌套接口中的方法,达到方法的统一。 ```delphi type ILogging = interface procedure LogMessage(const Message: string); end; IUnitOfWork = ...
数据库访问接口技术是计算机科学中一个至关重要的领域,它涉及到如何高效、安全地与数据库系统进行交互。在众多数据库访问技术中,ODBC(Open Database Connectivity,开放数据库连接)和ADO(ActiveX Data Objects...
标题中的“经典的数据库访问接口”很可能指的是在Java编程中广泛使用的JDBC(Java Database Connectivity),这是一个标准的应用程序编程接口,允许Java程序与各种关系型数据库进行交互。JDBC提供了连接数据库、发送...
- **资源导向**:每个URL代表一个资源,通过HTTP方法(GET、POST、PUT、DELETE等)操作资源。 - **无状态**:每次请求包含所有必要的信息,服务器不保存客户端状态。 - **缓存机制**:可选支持HTTP缓存策略,提高...
3. **多重继承支持**:一个类可以通过实现多个接口来模拟多重继承,这是.NET中解决多重继承问题的一种方法。 4. **强制实现**:实现接口的类必须提供接口中声明的所有成员的具体实现。 5. **静态成员不可用**:接口...
4. **实现接口**:使用`implements`关键字,一个类可以实现一个或多个接口。实现接口意味着类必须提供接口中所有抽象方法的实现。 5. **接口的默认方法**:从Java 8开始,接口可以包含带有默认实现的方法。这样,...
这样,一个类可以通过实现多个接口来具备多种行为。 4. **接口的实现**: 当类实现接口时,必须提供接口中所有抽象方法的实现,除非类本身是抽象类。例如: ```java class ClassName implements InterfaceName {...
当一个类包含至少一个抽象方法时,或者当一个类没有完全实现其父类的抽象方法时,应该将其声明为抽象类。 #### 十六、接口的定义 接口是一个只包含公共抽象方法的类。这些方法必须在实现该接口的类中被具体实现。 ...
可重用性是软件工程中的一个重要概念,意味着代码可以在多个项目中重复使用,减少开发时间和成本。为了实现代码的可重用,我们需要遵循一些原则: 1. 抽象:通过封装细节,隐藏实现复杂性,只暴露必要的接口。 2. ...
- 可以选择显式实现接口成员,这时成员只能通过接口访问,不能直接通过类实例访问。 - 显式接口实现可以避免命名冲突,特别是在实现多个接口时。 **4. 接口的示例** ```csharp interface IMyExample { string ...