第一步:新建案例工程:
这个案例用到的是1.com.guigu.shen.Action的包里面的文件(Helloaction.java是控制类,springmvc_005.xml是springmvc的配置文件)。2.springmvc.xml。3.index.xml。4.web.xml。5.jsp/success.jsp
第一步:先写web.xml;
xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>SpringMvc_10day_selfdisplay-name> <filter> <filter-name>CharacterEncodingFilterfilter-name> <filter-class> org.springframework.web.filter.CharacterEncodingFilter filter-class> <init-param> <param-name>encodingparam-name> <param-value>UTF-8param-value> init-param> filter> <filter-mapping> <filter-name>CharacterEncodingFilter filter-name> <url-pattern>/*url-pattern> filter-mapping> <servlet> <servlet-name>DispatcherServletservlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServletservlet-class> <init-param> <param-name>contextConfigLocationparam-name> <param-value>classpath:spring.xmlparam-value> init-param> servlet> <servlet-mapping> <servlet-name>DispatcherServletservlet-name> <url-pattern>*.actionurl-pattern> servlet-mapping> <welcome-file-list> <welcome-file>index.jspwelcome-file> welcome-file-list> web-app>
第二步:写spring.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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd" > <import resource="com/guigu/shen/Action5/springmvc_005.xml"/> beans>
第三步:写com/guigu/shen/Action5/springmvc_005.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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd" > <context:component-scan base-package="com.guigu.shen.Action5"/> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/> beans>
第四步:写HelloAction.java控制器。
package com.guigu.shen.Action5; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; /* * 单例的控制器(由程序员去写) * 以前我们写控制的做法是implends Controller接口, * 或者extends Abs...抽象类 * 现在我不想这么写了,用注解来做,写一个@Controller这样就代表这个是一个控制器。这样解析这个类 * 时就知道他是控制器了。 * * */ @Controller public class HelloAction { public HelloAction() { System.out.print(this.hashCode()); }
/* * * @RequestMapping(value="/hello")表示这个方法是用来响应/hello.action请求的 * 按住alt+/就是跳出来注解里面的参数。只要是/hello.action的请求都会交给HelloAction中的 * helloMethod方法来处理。 * */
@RequestMapping(value="/hello") public String helloMethod(Model model) throws Exception { System.out.println("Hello:helloMethod()"); //往Model中封装数据。 model.addAttribute("message", "这是hello请求"); return "jsp/success.jsp"; }
/* * * @RequestMapping(value="/bey.action")表示这个方法是用来响应/bey.action请求的 * 按住alt+/就是跳出来注解里面的参数。只要是/bey.action的请求都会交给HelloAction中的 * beyMethod方法来处理。 * */ @RequestMapping(value="/bey.action") //@RequestMapping(value="/hello") public String beyMethod(Model model) throws Exception { System.out.println("Hello:helloMethod()"); //往Model中封装数据。 model.addAttribute("message", "这是bye请求"); return "jsp/success.jsp"; } }
第五步:编写success.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting pagetitle> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> head> <body> Success. <br> ${requestScope.message} body> html>
最后测试一下:输入http://127.0.0.1:8080/SpringMvc_10day_self/bey.action
结果:跳转到success.jsp 并输出“这是bye请求”内容。
输入http://127.0.0.1:8080/SpringMvc_10day_self/hello.action
结果:跳转到success.jsp 并输出“这是hello请求”内容。
对上面的案例流程说明一下:
1.浏览器发出请求,比如hello.action
2服务器根据web.xml的配置来到了DispatcherServlet.并且DispatcherServlet把这个请求给了映射器,映射器会去springmvc_005.xml中去寻找控制器类,到了那里发现了
@Controller注释过的类,发现有的,然后找到了HelloAction类。然后去这个类里面去找被注解了@RequestMapping(value="/hello")的方法,然后找到了helloMethod(Model model)方法然后去执行这个方法。执行好之后返回一个Model,然后把这个Model交给视图解析器去解析,解析好之后在交给DispatcherServlet,最后DispatcherServlet根据解析出来的网址跳转到success.jsp 并输出“这是hello请求”内容。
问题:
1.刚开始的时候我在springmvc_005.xml是这么配置的。
<context:component-scan base-package="com.guigu.shen.Action5"/>
这两个一起配置,然后就会出错,说是重复了。你想啊第一句是通过注解的方式去找了。第二句直接通过xml的方式去找了,相当于去找了两次,当然会冲突啊。
2. 把<context:component-scan base-package="com.guigu.shen.Action5"/>去掉。
保留
我在想为什么也会成功啊?照理说,我在HelloAction类里面的方法也是用注解去配的啊,我都把注解那句去掉了,保留了xml的方式,之前次采用xmL的方式时,里面的
执行方法是有特定写法的?答案:<context:component-scan base-package="com.guigu.shen.Action5"/>这句只是告诉系统前去com.guigu.shen.Action5这个包里面寻找
被@Contolrr注解过的类。至于里面的 @RequestMapping(value="/hello") 这些注解当然可以使用啊。然后只是把寻找里面控制类的任务直接由
去完成了罢了。并不影响 @RequestMapping(value="/hello")注解的寻找。