这其中,第二部分的意思就是,SpringMVC里有个跳转类型叫做ModelAndView,它setView之后,就会自动跑到view名字+后缀的文件上去,比如setView("index"),那么在这个配置文件下,就会自动跳转到index.jsp上,而且是WEB-INF/jsp下的index.jsp上,WEB-INF下的jsp无法直接通过地址栏访问,所以这种控制可以让容器对资源访问权限进行管理。
大功告成,最困难的配置文件就这么搞定了,我可是花了好多时间在网上搜了来着,现在你们已经拥有了基石般的配置文件信息,你可以在上面测试通配符啦等你觉得方便的任何内容。
好了,看配置文件上的包也能知道,我的DAO是这么写的。
非常奇怪,使用@Controller和@Resource必须得实现接口,得这么写:
接口:
public interface IUserDao {
public List query(String sql);
public List queryByName(String name);
}
DAO代码:
@Repository
public class UserDao implements IUserDao{
Session session;
@Autowired
UserDao(SessionFactory sessionFactory){
session = sessionFactory.getCurrentSession();
session.beginTransaction();
}
public List query(String sql) {
SQLQuery query = session.createSQLQuery(sql).addEntity(User.class);
return query.list();
}
public List queryByName(String username){
String sql = "select * from pub_user where username=?";
SQLQuery query = session.createSQLQuery(sql).addEntity(User.class);
query.setString(0, username);
return query.list();
}
}
这里我可是试了好多种方法,由于我喜欢直接写sql语句,以充分利用关系数据库的“关系”特性(毕竟关系型数据库不是和对象无缝贴合的,要发挥其最大优势应该从数据表之间的关系入手。有异议就提,最好论据充分,我需要证据不是结论,有了证据我也可以自己分析分析了,说不定我还知道点别的,能得出更有用的结论),所以我在这里使用了SQLQuery,否则你可以直接session.createQuery(hql)。但是,这里有一个问题,我继承HibernateDAOSupport反而会获取不到session或别的什么东西。
我在这儿顺便附上JavaBean的,完全注解。
@Entity
@Table(name="pub_user")
public class User {
@Id
@Column(name = "id", unique = true, nullable = false)
String id;
@Column(name="username")
String username;
@Column(name="passwd")
String passwd;
@Column(name="user_ip")
String userIp;
//getter和setter...自己用Eclipse生成吧,我省略掉了
}
DAO这样写,那么我的Service就可以这么写了。一样的先接口,再@Controller
public interface UserService {
public List getUsers();
}
@Service
public class UserServiceImpl implements UserService{
@Resource
IUserDao dao;
public List getUsers(){
List list = dao.query("select * from pub_user");
return list;
}
}
你看哦,我这里@Resource,必须写在接口定义的变量上面,然后Spring会自己去找谁实现了它并且还是@Resource的。关于具体命名管理,还有一些内容就不说了,这个在我们这么点代码的例子中根本就遇不到的。记得我说的,万一有两个DAO都实现了这个接口,那该怎么办呢,这就是命名管理要做的事情,自己去看吧(说不定你还没看完这篇博客就放弃Spring了,那么写上去真是多此一举……什么?你不会放弃?你不会放弃我也不写啊,我又没用到)。
接下来就是@Controller了,这里不需要接口了,嘿嘿(我就说,UserDao都是UserDao<T>,里面的save方法都不用定义具体类型了,干嘛每个模块还要用不同的DAO?既然大家都用一个DAO,干嘛还要依赖接口编程?我直接泛型<T>继承了一个HibernateDAO后,Spring还不许我这么访问DAO。不用拿概念忽悠我,我知道内聚和耦合在什么样的规模下会展现出自身特性的怎样的优缺点,但注解依赖接口编程的强制性让我搭建环境的过程中走了很多弯路。好吧,也有可能明明有办法不用建接口,只是我不知道罢了)。