猜数游戏(Spring版本)

猜数游戏(Spring版本)

相比之前的版本(jsp+servlet)以及struts版本的猜数游戏,Spring版本的猜数游戏中servlet的功能将被拆分,将其中的控制逻辑抽取出来,写成一个Controller类,只负责转发逻辑,并把生命周期的部分逻辑交给我们新写的Listener类处理。另外,新增了一个app-context.xml文件来配置Spring-MVC设置(重要!)。

NumberGuessController

现在控制器的部分变得相当简洁,不过要注意新增的两个注解@Controller、@RequestMapping(path = { "/guess", "/" })@Controller用于将该类标记为控制器,职责是处理请求(注意guess方法的参数!sessionrequest返回值),@RequestMapping(path = { "/guess", "/" })用于标记当前方法(也就是guess)所对应的候选URL,当输入URL和候选值匹配时,就会将请求交给controller这个控制器的控制方法(guess)处理。

@Controller
public class NumberGuessController {
	@RequestMapping(path = { "/guess", "/" })
	public String guess(HttpSession session, HttpServletRequest request) {
		
		NumberGuessBean numguess = null;

		if (session.getAttribute("numguess") == null) {
			numguess = new NumberGuessBean();
			session.setAttribute("numguess", numguess);
		} else {
			numguess = (NumberGuessBean) session.getAttribute("numguess");
		}
 
		String guess = request.getParameter("guess");

		if (guess == null) {
			guess = "";
		}
		
//		if(numguess.getSuccess()) {
//			numguess.reset();
//		}

		// invoke business logic, invoke model
		if (guess.length() > 0) {
			numguess.setGuess(guess);
		}

		if (numguess.getSuccess()) {
			return "success";
		} else if (numguess.getNumGuesses() == 0) {
			return "welcome";
		} else {
			return "continue";
		}

	}
}

ResetGuessBeanListener

package listener;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import num.NumberGuessBean;

/**
 * Application Lifecycle Listener implementation class ResetGuessBeanListener
 *
 */
@WebListener
public class ResetGuessBeanListener implements ServletRequestListener {


	/**
     * @see ServletRequestListener#requestDestroyed(ServletRequestEvent)
     */
    public void requestDestroyed(ServletRequestEvent sre)  { 
     
         HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
         HttpSession session = request.getSession();
         
         if(session.getAttribute("numguess")!=null) {
        	 NumberGuessBean numguess = (NumberGuessBean) session.getAttribute("numguess");
        	 if(numguess.getSuccess()) {
        		 numguess.reset();
        	 }
         }
    }

	/**
     * @see ServletRequestListener#requestInitialized(ServletRequestEvent)
     */
    public void requestInitialized(ServletRequestEvent sre)  { 
         // TODO Auto-generated method stub
    }
	
}

主要就是负责reset这个操作,本来是放在servlet中的,是为了明确控制器的逻辑而做的解耦操作。使用的是@WebListener这个注解。

app-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
	  	http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
	    http://www.springframework.org/schema/mvc/spring-mvc.xsd">

	<mvc:annotation-driven />

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

	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass"
			value="org.springframework.web.servlet.view.JstlView" />
		<property name="prefix" value="/WEB-INF/jsp/" />
		<property name="suffix" value=".jsp" />
		<property name="order" value="3" />
	</bean>

</beans>

接下来逐句分析:

  1. 启用注解驱动:

    <mvc:annotation-driven />  
    
    • 这一行启用了Spring MVC的注解驱动支持。这意味着可以使用Spring MVC注解(如@Controller@RequestMapping等)来处理HTTP请求。这是配置Spring MVC的基本步骤之一。
  2. 组件扫描:

    <context:component-scan base-package="controller"></context:component-scan>  
    
    • 指定Spring扫描controller包,并自动注册所有标有注解(如@Controller, @Service, @Repository等)的类。这允许Spring自动识别和管理这些组件。
  3. 视图解析器:

    <bean id="viewResolver"  
          class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />  
        <property name="prefix" value="/WEB-INF/jsp/" />  
        <property name="suffix" value=".jsp" />  
        <property name="order" value="3" />  
    </bean>  
    
    • 定义了一个名为viewResolver的Bean,使用InternalResourceViewResolver来解析视图名称。
    • viewClass:指定使用JSTL视图作为视图类。
    • prefix:设置视图的前缀,所有的JSP视图都存放在/WEB-INF/jsp/目录下。
    • suffix:设置视图的后缀,所有被解析的视图文件都以.jsp结尾。
    • order:视图解析的优先级,具体值(如3)可以用于多个视图解析器的排序。
posted @ 2024-11-18 08:30  Ackley  阅读(23)  评论(0)    收藏  举报  来源