好长时间没用java了,现在再看ssh ,有点陌生。这里将ssh整合的知识点列出来,提醒自己。
1.实体类上的注解。 hibernate的注解。
@Entity 注解将一个类声明为实体 Bean ;@Table 为实体Bean指定对应数据库表中的名字;@Id 注解可将实体Bean中某个属性定义为主键;使用@GenerateValue注解可以定义该标识符的生成策略。
@Entity @Table(name="t_user") public class User { private int id; private String name; private String password; private String email; @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } ....... )
2.action类上的注解。spring的注解。
@@Component注解 (不推荐使用),类上加上一个@Component注解,就将该类定义为一个Bean了。Spring还提供了更加细化的注解形式:@Repository、@Service、@Controller,它们分别对应存储层Bean,业务层Bean,和展示层Bean。目前版本(2.5)中,这些注解与@Component的语义是一样的,完全通用,在Spring以后的版本中可能会给它们追加更多的语义。我们推荐使用@Repository、@Service、@Controller来替代@Component。
spring 共有4种“组件”式注解
@Component:可装载组件
@Repository:持久层组件
@Service:服务层组件
@Controller:控制层组件
@Scope("prototype") struts的action拖给spring管了,写上这样一句后,每次请求都会重新创建一个action。
@Resource(这个注解属于J2EE的),默认安装名称进行装配,不用重新new对象。名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。
@Resource注解在字段上,这样就不用写setter方法了,并且这个注解是属于J2EE的,减少了与spring的耦合。这样代码看起就比较优雅。
把service的接口(注意不要是service的实现类)注入到action中。这里的name名称是 Class UserServicesImpl 中定义的组件名称。
@Component("login") @Scope("prototype") public class LoginAction extends ActionSupport implements ModelDriven{ /** * */ private static final long serialVersionUID = 1L; private UserRegisterInfo info = new UserRegisterInfo(); private UserService us; public UserService getUs(){ return us; } @Resource(name="userService") public void setUs(UserService us) { this.us = us; } @Override public String execute() throws Exception { User user=new User(); user.setName(info.getName()); user.setPassword(info.getPassword()); HttpServletRequest request = ServletActionContext.getRequest(); if (us.validate(user)){ request.setAttribute("name", info.getName()); System.out.println(request.getAttribute("name")); System.out.println("login success"); return "success"; } else { request.setAttribute("name", info.getName()); System.out.println(us.validate(user)+"--"); request.setAttribute("name", null); return "error"; } }
下面的代码是利用@Resource将userdao装配到UserServiceImpl这个类中,然后就可以里就可以利用 userdao了。这里的名称就是userdao。在类UserDaoImpl中定义的组件名称为 @Component("userdao"),正好相同,所以这里面的@Resource后面可以不加名称。
@Component("userService") public class UserServiceImpl implements UserService { private UserDao userdao; public UserDao getUserdao() { return userdao; } @Resource public void setUserdao(UserDao userdao) { this.userdao = userdao; } public void add(User user) throws Exception{ userdao.save(user); } public boolean exits(User user) throws Exception{ return userdao.exits(user.getName()); } public boolean validate(User user) throws Exception { return userdao.validate(user); } }