Spring MVC - 如何将控制器与服务类和DAO连接?

时间:2016-01-19 18:27:37

标签: java spring spring-mvc

我正在学习DAO和服务,我试图为一些测试(JSP)制作一个非常简单的Web应用程序。我创建了DAO和Service类,但是如何让它们相互合作?我希望为了在textfield中输入的值将保存在我的数据库中。这是一个代码:

StudentDAO:

public void create(Student student);

StudentDAOImpl:

private JdbcTemplate jdbcTemplate;

DataSource dataSource;

public JdbcTemplate getJdbcTemplate() {
    return jdbcTemplate;
}

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
}

public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
}

public void create(Student student) {
    String query = "insert into studentdb.student (`name`, `age`) values (?,?)";
    Connection con = null;
    PreparedStatement ps = null;
    try{
        con = dataSource.getConnection();
        ps = con.prepareStatement(query);
        ps.setString(1, student.getName());
        ps.setString(2, student.getAge());
        int out = ps.executeUpdate();

    }catch(SQLException e){
        e.printStackTrace();
    }finally{
        try {
            ps.close();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

StudentService看起来与StudentDAO完全相同,这里是StudentServiceImpl:

StudentDAO studentDAO;


public void createStudent(Student student) {

    ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("studentconfig.xml");

    studentDAO = ctx.getBean("studentDAO", StudentDAO.class);

    student.setName(//value entered in webapp);
    student.setAge(//value entered in webapp);

    studentDAO.create(student);
}

这是MainController:

@RequestMapping(value="/home.html", method = RequestMethod.POST)
public ModelAndView homePagePost(Model model, @ModelAttribute("student") Student student1){

     model.addAttribute("student", student1);
     studentService.createStudent(student1);

    ModelAndView home = new ModelAndView("index");
    return home;
}

的index.jsp:

<html>
<body>
<h2>Hello World!</h2>
<form action="/webapplication/home.html" method="post">
<input type="text" name="${student.name}"/>
<input type="text" name="${student.age} }"/>
<input type="submit" value="confirm!"/>
</form>
</body>
</html>

2 个答案:

答案 0 :(得分:0)

你需要DI(依赖注入),或者更准确地说是执行它 - 控制反转。

了解此Spring DISpring IoC containers

然后,您需要使用以下注释指示要将类自动装配到另一个类的位置:

@RestController
public class LoginController {
    @Autowired
    private LoginService loginService;

之后你需要声明应用程序上下文要扫描哪些类来初始化所有类并注入所有依赖项,如下所示:

<context:component-scan base-package="controller" />
<context:component-scan base-package="service" />
<context:component-scan base-package="dao" />

因此,当您部署应用程序时,部署描述符将与应用程序上下文一起进行解析,然后使用类及其依赖项扫描包,spring bean容器将从IoC原则开始将所有这些类初始化为从最后开始将这些类注入另一个。< / p>

一般来说,你需要这样做,也许我已经跳过了一些东西,但这就是原则。

答案 1 :(得分:0)

如上所述,一个很好的解决方案是弹簧依赖注入。

以下是一些简化的信息: https://www.youtube.com/watch?v=6F3Cv1a7G0w

这是您的StudentDao实施:

public interface StudentDao {

}

@Component
public class StudentDaoImpl implements StudentDao {
   //TODO Your Code
}

这是您的StudentService实施:

@Service
public interface StudentService { 

}

@Component
public class StudentServiceImpl implements StudentService {

   @Autowired
   private StudentDao studentDao;

}

这是你的StudentController实现:

@Controller
public interface StudentController { 

}

@Component
public class StudentControllerImpl implements StudentController {

    @Autowired
    private StudentService studentService;

}

这是您的Application类(如果您使用的是SpringBoot):

@SpringBootApplication
@ComponentScan("com.your.packages.controller", "com.your.packages.service", "com.your.packages.dao")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@ComponentScan将告诉指示Spring在指定的包中搜索用@ Component,@ Service,@ Controller等注释的类。