猜数游戏(Spring版本)
猜数游戏(Spring版本)
相比之前的版本(jsp+servlet)以及struts版本的猜数游戏,Spring版本的猜数游戏中servlet的功能将被拆分,将其中的控制逻辑抽取出来,写成一个Controller类,只负责转发逻辑,并把生命周期的部分逻辑交给我们新写的Listener类处理。另外,新增了一个app-context.xml文件来配置Spring-MVC设置(重要!)。
NumberGuessController
现在控制器的部分变得相当简洁,不过要注意新增的两个注解@Controller、@RequestMapping(path = { "/guess", "/" }),@Controller用于将该类标记为控制器,职责是处理请求(注意guess方法的参数!session和request返回值),@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>
接下来逐句分析:
-
启用注解驱动:
<mvc:annotation-driven />- 这一行启用了Spring MVC的注解驱动支持。这意味着可以使用Spring MVC注解(如
@Controller、@RequestMapping等)来处理HTTP请求。这是配置Spring MVC的基本步骤之一。
- 这一行启用了Spring MVC的注解驱动支持。这意味着可以使用Spring MVC注解(如
-
组件扫描:
<context:component-scan base-package="controller"></context:component-scan>- 指定Spring扫描
controller包,并自动注册所有标有注解(如@Controller,@Service,@Repository等)的类。这允许Spring自动识别和管理这些组件。
- 指定Spring扫描
-
视图解析器:
<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)可以用于多个视图解析器的排序。
- 定义了一个名为

浙公网安备 33010602011771号