`

基于注解方式的Spring MVC实例(2011.4.13)

阅读更多

接着昨天,今天又写了一个基于注解的spring mvc的例子,里面也存在很多的疑问,欢迎大家解答,非常感谢!不多说,直接上码了.

web.xml

<servlet>
		<servlet-name>DispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:applicationContext.xml</param-value>
		</init-param>
	<load-on-startup>0</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>DispatcherServlet</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>

 

applicationContext.xml

<!-- 让Spring启用对annotation的支持 -->
	<context:annotation-config></context:annotation-config>

    <!--<bean id="multipartResolver"    
       class="org.springframework.web.multipart.commons.CommonsMultipartResolver"    
       p:defaultEncoding="utf-8" />-->
	<bean id="login" class="org.yonge.model.Login"></bean>
	<!--<bean id="loginAction" class="org.yonge.action.LoginController"></bean>-->
	
	<!--   下面的配置可以读取hibernate.properties文件内容
	<context:property-placeholder location="classpath:/hibernate.properties" />	
	-->
	
	<!-- 为什么下面的定义都可以不需要? -->
	<!-- 自动扫描org.yonge路径下的所有文件,并根据注解完成注入的工作 -->
	<context:component-scan base-package="org.yonge"></context:component-scan>

	<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->    
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
    
    <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->    
    <bean id="ViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/"></property> <!-- 视图文件的前缀 --> 
		<property name="suffix" value=".jsp"></property> <!-- 视图文件的后缀名 --> 
		<!-- view是用什么显示,这里是jsp,还可以用velocity之类的 -->
		<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>  
	</bean>

 

控制器

@Controller
//@Scope("prototype")
@RequestMapping("/loginAction.do")
public class LoginController {

	@Resource(name="login")  //根据名称注入
	@Autowired   //自动装配,如果没有,Login对象中的属性是不会注入
	private Login login;
	//不用下面的get/set方法也可以自动注入
	public Login getLogin() {
		return login;
	}

	public void setLogin(Login login) {
		this.login = login;
	}

//	@RequestMapping()  //注意:方法上必须要有此注解,
							//否则会抛异常:javax.servlet.ServletException: No adapter for handler [org.yonge.action.LoginController@10202aa]: 
							//Does your handler implement a supported interface like Controller?

	public String load(HttpServletRequest request, ModelMap modelMap, Login login)
	{
//		modelMap.put("userName", request.getParameter("userName"));
//		modelMap.put("passWord", request.getParameter("passWord"));
		System.out.println("userName:"+login.getUserName());
		System.out.println("passWord:"+login.getPassWord());
		modelMap.put("loginModel", login);
		return "ok";
	}
	
	public String load(ModelMap modelMap)
	{
		return "ok";
	}
	@RequestMapping()
	public String load(HttpServletRequest request, ModelMap modelMap)
	{
//		modelMap.put("userName", request.getParameter("userName"));
//		modelMap.put("passWord", request.getParameter("passWord"));
		System.out.println("Login Object:"+login.toString());
		System.out.println("userName:"+login.getUserName());
		System.out.println("passWord:"+login.getPassWord());
		modelMap.put("loginModel", login);
		return "ok";
	}

//	@RequestMapping()  //如果用注解,此方法为什么不能运行    异常信息: argument type mismatch
	//如果不用注解的形式,此方法是可以正常执行的
	protected ModelAndView onSubmit(HttpServletRequest request,
			HttpServletResponse response, Object command, BindException errors)
			throws Exception {
		System.out.println("注解形式,执行4个参数方法");
		Login login=(Login) command;
		System.out.println("UserName:"+login.getUserName());
		System.out.println("PassWord:"+login.getPassWord());
		//第一种传值及显示
//		request.setAttribute("userName", login.getUserName());
//		request.setAttribute("passWord", login.getPassWord());
//		return new ModelAndView("ok");
		//第二种传值及显示
//		return new ModelAndView("ok","loginModel",login);
		//第三种传值及显示
		Map mapModel=new HashMap();
		mapModel.put("loginModel", login);
		return new ModelAndView("ok",mapModel);
	}
	
	
}

 

首页

<form action="./loginAction.do" method="get">
	  	<table align="center" width="50%" border="0">
	  		<tr>
	  			<td>UserName:</td>
	  			<td>
	  				<input type="text" name="userName">
	  			</td>
	  		</tr>
	  		<tr>
	  			<td>PassWord:</td>
	  			<td>
	  				<input type="text" name="passWord">
	  			</td>
	  		</tr>
	  		<tr>
	  			<td colspan="2">
	  				<input type="submit"" value="提交">
	  			</td>
	  		</tr>
	  	</table>  		
  	</form>

 

跳转页面

<body><!--
  	登录成功!!!
  	UserName:${userName }
  	PassWord:${passWord } -->
  	UserName:${loginModel.userName }
  	PassWord:${loginModel.passWord }
  </body>

 

Model

public class Login {

	private String userName;
	private String passWord;
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassWord() {
		return passWord;
	}
	public void setPassWord(String passWord) {
		this.passWord = passWord;
	}
}

 

疑问:

1、控制器中处理请求的方法,有哪些定义形式?

2、applicationContext.xml文件中至少需要定义些什么内容?什么时候需要定义上面所说的?

 

感受:

1、如果熟练,开发速度较快

2、太过灵活

分享到:
评论
6 楼 jayyunfei 2012-04-25  
用了注解了,applicationContext.xml还要定义什么吗?关于controller应该不用定义了吧?
还有就是我怎么执行不了login.jsp我把这个页面放在webcontent中然后run on server报错说是找不到页面~~~~
5 楼 jayyunfei 2012-04-25  
那为什么你的类中有几个方法么有注解?
4 楼 yonge812 2012-04-24  
jayyunfei 写道
controller中的方法不用@RequestMapping 注解是不是就一次执行?

不用应该找不到方法吧?
3 楼 jayyunfei 2012-04-24  
controller中的方法不用@RequestMapping 注解是不是就一次执行?
2 楼 summer1433 2011-04-15  
是很灵活,你找个英文文档看看就知道了。
1 楼 coollifer 2011-04-13  
太过灵活...

相关推荐

Global site tag (gtag.js) - Google Analytics