〈转〉原文地址:http://www.coridc.com/archives/2758.html
将Servlet与Spring进行整合,使Service层能注入到Servlet中,当然,这里的Servlet是纯正的Servlet 3,而不是Struts的ActionServlet或者是SpringMVC啥啥的。
解决方法有两种(推荐使用第二种)
方法一:
直接重写Servlet的Init()方法,代码如下:
public void init(ServletConfig servletConfig) throws ServletException {
ServletContext servletContext = servletConfig.getServletContext();
WebApplicationContext webApplicationContext = WebApplicationContextUtils
.getWebApplicationContext(servletContext);
AutowireCapableBeanFactory autowireCapableBeanFactory = webApplicationContext
.getAutowireCapableBeanFactory();
autowireCapableBeanFactory.configureBean(this, BEAN_NAME);
}
这里的BEAN_NAME即为我们需要注入到Spring容器中的服务,但这并不是一个好的方法,因为我们需要在每一个Servlet中都进行这样的操作。
方法二:
我们可以写一个类似于“org.springframework.web.struts.DelegatingRequestProcessor”的委托的Bean,然后通过配置的方法把我们的服务注入到servlet中,具体方法如下,
Step 1:编写委托类DelegatingServletProxy
package com.telek.pba.base.util;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
/**
* 以下是类似org.springframework.web.struts.DelegatingRequestProcessor的一个委托
* 用于通过配置的方法,在Servlet中注入Service
* @author liyinwei
*
*/
public class DelegatingServletProxy extends GenericServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
private String targetBean;
private Servlet proxy;
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
proxy.service(req, res);
}
/**
* 初始化
*/
public void init() throws ServletException {
this.targetBean = getServletName();
getServletBean();
proxy.init(getServletConfig());
}
/**
* 获取Bean
*/
private void getServletBean() {
WebApplicationContext wac = WebApplicationContextUtils
.getRequiredWebApplicationContext(getServletContext());
this.proxy = (Servlet) wac.getBean(targetBean);
}
}
Step 2:修改Web.xml配置
在纯Servlet模式下,我们的配置方式如下(以下由于代码高亮插件的问题,请将代码中的#替换成尖括号)
<servlet>
<description>活动发起模块活动查询分页Servlet</description>
#display-name#launchActivityQueryServlet#/display#
#servlet-name#LaunchActivityQueryServlet#/servlet-name#
#servlet-class#com.telek.pba.launch.servlet.LaunchActivityQueryServlet#/servlet-class#
#servlet#
#servlet-mapping#
#servlet-name#LaunchActivityQueryServlet#/servlet-name#
#url-pattern#/servlet/launch/LaunchActivityQueryServlet#/url-pattern#
#/servlet-mapping#
</servlet>
如果采用我们这种代理的方法,则配置应该修改为:
<servlet>
<description>活动发起模块活动查询分页Servlet</description>
#display-name#launchActivityQueryServlet#/display#
#servlet-name#launchActivityQueryServlet#/servlet-name#
#servlet-class#com.telek.pba.base.util.DelegatingServletProxy#/servlet-class#
#servlet#
#servlet-mapping#
#servlet-name#launchActivityQuery#/servlet-name#
#url-pattern#/servlet/launch/LaunchActivityQueryServlet#/url-pattern#
#/servlet-mapping#
</servlet>
注意:默认情况下,Servlet的配置中,LaunchActivityQuery的首字母一般为大写,而我们的标题中已注明,我们采用Spring的注解模式,如果是自动扫描注解的话,默认情况下,注解的value值为首字母小写,即:launchActivityQuery,因此,在我们新的配置中,要注意将首字母改为小写,否则会报无法找到Bean的错误。
Step 3:至此,我们就可以像SSH的注入方式一样,注入Servlet了,以下是个小示例:
package com.telek.pba.launch.servlet;
import java.io.IOException;
import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import com.telek.pba.base.model.PbaUserInfo;
import com.telek.pba.launch.dao.IPbaActivityInfoCurrentDAO;
@Component
public class LaunchActivityQueryServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
//注入IPbaActivityInfoCurrentDAO
@Resource
private IPbaActivityInfoCurrentDAO pbaActivityInfoCurrentDAO;
/**
* Constructor of the object.
*/
public LaunchActivityQueryServlet() {
super();
}
/**
* Destruction of the servlet. <br />
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
/**
* The doGet method of the servlet. <br />
*
* This method is called when a form has its tag value method equals to get.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//sth to do
}
/**
* The doPost method of the servlet. <br />
*
* This method is called when a form has its tag value method equals to post.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//sth to do
}
/**
* Initialization of the servlet. <br />
*
* @throws ServletException if an error occurs
*/
public void init() throws ServletException {
// Put your code here
}
}
最后,请留心在Spring配置文件中,配置上自动扫描包的路径:
<context:component -scan base-package="com.telek.pba.*.dao.impl,
com.telek.pba.*.service.impl,
com.telek.pba.*.servlet"></context:component>
大功告成!
分享到:
相关推荐
本文将深入探讨如何整合Spring MVC与MyBatis,以及如何在MyBatis中使用注解模式。 首先,Spring MVC是一个轻量级的Java Web框架,它提供了强大的模型处理、视图解析和控制器管理功能。而MyBatis则是一个持久层框架...
在实际项目中,"springdemo3" 这个文件可能包含了一个简单的 Spring MVC + iBatis + Spring 2.5 注解的应用示例,其中包括配置文件(如 applicationContext.xml 和 servlet-context.xml)、Controller 类、Service ...
- 配置好后,需要将DWR的Servlet添加到Web应用的Servlet容器中,如Tomcat。 - 使用DWR提供的调试工具或者自定义JavaScript代码来测试远程调用是否正常。 通过以上步骤,我们可以实现DWR与Spring的无缝结合,利用...
在本主题中,我们将深入探讨"spring使用注解依赖jar"这一关键知识点,包括Spring框架如何通过注解来实现依赖注入,以及如何管理相关的jar包。 首先,Spring框架的核心特性之一就是依赖注入(Dependency Injection,...
4. **错误的注解使用**:确保在需要注入的对象上使用了正确的注解,如`@Component`、`@Service`、`@Repository`或`@Controller`,并在Spring配置中启用组件扫描。 ```xml ``` 5. **类型安全的依赖注入**:如果...
标题 "Spring全注解project示例 (无web.xml配置)" 提供了我们即将探讨的核心主题:一个使用Spring框架,完全依赖注解配置的项目,且没有传统的web.xml部署描述符。这种配置方式在现代Spring应用中非常常见,因为它...
Controller类通常通过注解如`@RequestMapping`来定义处理路径,使用Spring的强大功能如AOP(面向切面编程)和DI(依赖注入)来简化业务逻辑。然而,Spring MVC的性能通常被认为略逊于原生Servlet,因为框架本身引入...
《Spring Web MVC框架详解——基于org.springframework.web.servlet-3.1.0.RELEASE.jar》 在Java Web开发领域,Spring框架无疑是最具影响力的框架之一,其中Spring Web MVC是其核心组件,专注于处理Web请求和响应。...
请求到达后,Spring MVC的Controller层(可能是继承自Spring的AbstractController或使用@RestController注解的类)会接收到请求,然后调用Service层进行业务逻辑处理。Service层会利用Spring的依赖注入获取到...
在这个例子中,Spring 会自动找到合适的 `Dependency` 实例并注入到 `MyService` 中。 **测试和运行** 在 Java 应用中,我们可以创建一个主类来启动应用程序,并从 Spring 容器中获取 Bean 实例。例如: ```java ...
- **`@Autowired`** 注解:用于自动装配Bean,这里用于将`BbtForumService`服务注入到Controller中。 - **返回值**:"listBoard"表示处理完请求后返回的视图名称,Spring MVC会根据这个名称去查找对应的视图模板。 ...
在Spring框架中,Servlet的管理是一项重要的任务,它涉及到Web应用的请求处理和业务逻辑的集成。`SimpleServletHandlerAdapter`是Spring MVC中一个关键组件,它为非Spring MVC注解驱动的Servlet提供了一种简单的方式...
在Spring中,通过`@Autowired`注解可以将SqlSessionTemplate或SqlSessionFactory注入到Service层,实现对数据库的操作。 **Spring 注解** Spring框架中的注解大大减少了XML配置,提高了代码的可读性和可维护性。...
集成 Spring MVC 和 DWR,可以利用 Spring 的依赖注入特性,将 DWR 的服务 bean 注入到 Spring MVC 控制器中,使得整个应用更加模块化和易于管理。在实际项目中,通常会创建一个专门的 DWRController 或 Service,将...
- **@Bean**: 在配置类中使用,用来声明创建一个bean并将其注册到Spring容器中。 ##### 2.2 Spring-Web 模块的注解 - **@RestController**: 组合了@Controller和@ResponseBody两个注解,表示这是一个RESTful风格的...
2. **Filter**: 同样,可以在Filter的init()方法中获取ApplicationContext,或者通过ServletContextAware接口,将Spring上下文注册到ServletContext,然后在doFilter()方法中使用。 3. **Listener**: 在监听器的...
将 Struts2 与 Spring 结合,通常会使用 Spring MVC 框架,通过 `@Controller` 注解标记 Action 类,并利用 Spring 自动装配功能来管理依赖。Spring MVC 还提供了其他注解,如 `@RequestMapping`, `@GetMapping`, `@...
- **`@Bean`注解**:标记在方法上,表示该方法返回的对象将作为bean注册到Spring容器中。 - **`@Configuration`注解**:标记配置类,表明此类包含一个或多个`@Bean`方法。 ##### 2. Bean的作用域 - **`@Scope`注解...
在全注解开发中,我们可以使用@Autowired注解自动装配bean,@Service、@Repository和@Controller注解则分别用于标记服务层、数据访问层和控制层的组件,方便Spring管理。 Hibernate是一个流行的Java ORM(对象关系...
3. **SpringProperties配置**: SpringProperties是Spring框架中用于管理配置的一种方式,它可以将配置文件中的属性值注入到Java对象中。在处理SFTP连接时,我们可以将服务器地址、端口、用户名和密码等信息写入到如`...