0 0

问一个很基础的问题,为什么这样可以实现直接访问接口的方法?5

 

我是用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();
	}

}

 

 

 

2014年9月09日 10:01
  • 大小: 47.4 KB

7个答案 按时间排序 按投票排序

0 0

我以前也有这个疑问,后来看了java基础中继承就明白了很多

2014年9月11日 10:23
0 0

赶紧扔了webwork 换spring mvc吧

2014年9月10日 16:38
0 0

1. 因为userSerive在BaseAction中有定义,所以userAction就继承了这个属性
2. userService有个@Resource,默认会byName查找id为userService的类,实例化后注入给userService,这是就可以直接调用userService中的方法了
3. applicationContext这个配置文件中是不是应该有id = userService的声明,或者直接在userServiceImpl方法上加上@Service("userService")

2014年9月10日 16:19
0 0

没看见你的BaseAction里面已经有属性userservice了吗。。

2014年9月10日 10:44
0 0

inject一个接口类型时,spring会在容器里先按id/name查找实现类,找不到再按类型查找来注入,找不到再报错...

2014年9月10日 09:23
0 0

你是继承了BaseAction,里面就已经有userService

2014年9月09日 13:10
0 0

多看看Spring吧,这是Spring的IoC功能,Spring容器初始化的时候已经接口全部实例化了

2014年9月09日 11:38

相关推荐

    通用IDispatch接口实现方法

    5. **实现IDispatch接口**:尽管MFC没有提供现成的IDispatch接口实现,但可以使用ATL的IDispatchImpl类作为基础,或者手动实现GetIDsOfNames、Invoke等方法。GetIDsOfNames用于根据名称查找DISPID,Invoke则负责实际...

    C语言接口与实现 pdf 免费

    书中提到,一个良好的接口设计需要简洁明了,对于那些对设计接口感兴趣的程序员来说,这本书提供了一个很好的参考手册。每一章不仅介绍了接口的概念,还包括了实现这些接口的代码。作者通过具体的示例来说明如何构建...

    java 实现接口和继承关系

    2. **实现方式不同**:一个类可以实现多个接口,但只能直接继承一个父类。 3. **访问修饰符限制不同**:接口中的方法默认都是`public`的,而继承中的方法可以根据需求设置不同的访问级别。 4. **抽象程度不同**:...

    基于FPGA原语的低延时高速接口实现方法.pdf

    该方法首先对FPGA内部的I/O组件进行深入分析,并以此为基础,设计出能够动态改变输出延时的PHY接口和超低延时的高速接口。通过仿真验证了该方法的有效性,进而提出了使用原语实现低延时DDR SDRAM高速数据接口的方案...

    抽象类与接口中方法的相同点和不同点

    具体方法是指已经实现了方法体的方法,可以直接使用。在抽象类中,可以有属性、抽象方法和具体方法。 在抽象类中,如果方法名前面没有“abstract”关键字,那么此方法就一定要有方法体。抽象类中可以有具体的方法...

    delphi接口统一方法

    这种方式可以确保一个接口不仅提供自己的方法,还可以访问嵌套接口中的方法,达到方法的统一。 ```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提供了连接数据库、发送...

    C# 实现Rest服务接口,含实现文档

    - **资源导向**:每个URL代表一个资源,通过HTTP方法(GET、POST、PUT、DELETE等)操作资源。 - **无状态**:每次请求包含所有必要的信息,服务器不保存客户端状态。 - **缓存机制**:可选支持HTTP缓存策略,提高...

    中级.NET开发人员

    3. **多重继承支持**:一个类可以通过实现多个接口来模拟多重继承,这是.NET中解决多重继承问题的一种方法。 4. **强制实现**:实现接口的类必须提供接口中声明的所有成员的具体实现。 5. **静态成员不可用**:接口...

    【IT十八掌徐培成】Java基础第06天-01.接口.zip

    4. **实现接口**:使用`implements`关键字,一个类可以实现一个或多个接口。实现接口意味着类必须提供接口中所有抽象方法的实现。 5. **接口的默认方法**:从Java 8开始,接口可以包含带有默认实现的方法。这样,...

    Java基础精品课13-接口.zip

    这样,一个类可以通过实现多个接口来具备多种行为。 4. **接口的实现**: 当类实现接口时,必须提供接口中所有抽象方法的实现,除非类本身是抽象类。例如: ```java class ClassName implements InterfaceName {...

    C++面试基础问题

    当一个类包含至少一个抽象方法时,或者当一个类没有完全实现其父类的抽象方法时,应该将其声明为抽象类。 #### 十六、接口的定义 接口是一个只包含公共抽象方法的类。这些方法必须在实现该接口的类中被具体实现。 ...

    C语言接口与实现-创建可重用软件的技术

    可重用性是软件工程中的一个重要概念,意味着代码可以在多个项目中重复使用,减少开发时间和成本。为了实现代码的可重用,我们需要遵循一些原则: 1. 抽象:通过封装细节,隐藏实现复杂性,只暴露必要的接口。 2. ...

    基于C#的接口基础教程

    - 可以选择显式实现接口成员,这时成员只能通过接口访问,不能直接通过类实例访问。 - 显式接口实现可以避免命名冲突,特别是在实现多个接口时。 **4. 接口的示例** ```csharp interface IMyExample { string ...

Global site tag (gtag.js) - Google Analytics