springMVC学习笔记(入门)

目录结构:

1、写一个实现Controller接口的类
2、配置spring.xml文件,注册(配置)controller处理器
   <bean id="/名字.do" class="包名.实现类"/>
   写成.do是因为要过滤请求(注意:必须以"/"开头)
   必须写在WEB-INF目录下,且名字为[servlet-name]-servlet.xml(可以修改)
3、web.xml中注册(配置)中央调度器
    <servlet>
        <servlet-name>名字</servlet-name>
        <servlet-class>
         org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>名字</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    DispatcherServlet的初始化过程中,Spring MVC会在你web应用的WEB-INF目录下查找一个名    为[servlet-name]-servlet.xml的配置文件,并创建其中所定义的bean


HelloWorld.java

package com.lwj.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

//实现HttpRequestHandler接口
//继承AbstractController类,能够限制提交方式(GET OR POST)
//继承MultiActionController类,可以实现多个处理器方法
public class HelloWorld implements Controller {
    
    //HttpRequestHandler接口需要重写的方法
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        request.setAttribute("message", "Hello World!");
        request.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(request, response);
    }


    //Controller接口需要重写的方法 和 继承AbstractController类需要重写的方法
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // TODO Auto-generated method stub
        ModelAndView mv=new ModelAndView();
        //底层其实执行的是request.setAttribute()方法
        mv.addObject("message", "Hello World!");
        //如果没有注册视图解析器,要写成 "/WEB-INF/jsp/hello.jsp"                
        mv.setViewName("hello");
        return mv;
}
 }


springMVC.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.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- ******视图解析器******* -->
    <!-- 一、注册视图解析器,避免Controller实现类中视图路径书写冗余 -->
    <!-- 内部视图解析器,存在弊端,不能链接外部资源,这是默认的视图解析器解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 只能配一个文件夹 -->
        <!-- 前缀 -->
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <!-- 后缀 -->
        <property name="suffix" value=".jsp"></property>
    </bean>
    
    <!-- 二、根据bean名称的视图解析器 -->
    <!-- 外部资源视图类:RedirectView  内部资源视图类:JstlView  通过bean名称调用-->
    <bean id="taobao" class="org.springframework.web.servlet.view.RedirectView">
        <property name="url" value="http://taobao.com"></property>
    </bean>
    <bean id="internal" class="org.springframework.web.servlet.view.JstlView">
        <property name="url" value="/WEB-INF/jsp/hello.jsp"></property>
    </bean>
    <!-- 注册相应的视图解析器 -->
    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
    
    <!-- 三、第二种方法当视图很多时,会显得很累赘,可以通过另一个xml导入 -->
    <bean class="org.springframework.web.servlet.view.XmlViewResolver">
        <property name="location" value="classpath:myViews.xml"></property>
    </bean>

    <!-- ***********注册中央处理器映射器*************** -->    
    <!-- 这个表示以下指定的action请求都由id为myController的bean处理,避免创建多个bean,浪费内存 -->    
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <!-- 第一种方法  -->
        <!-- 
        <property name="mappings">
            <props>
                <prop key="/hello.action">myController</prop>
                <prop key="/world.action">myController</prop>
                <prop key="/my.action">myController</prop>
            </props>
        </property>  -->
        <!-- 第二种方法 -->
        <property name="urlMap">
            <map>
                <entry key="/hello.action" value="myController"></entry>
                <entry key="/world.action" value="myController"></entry>
                <entry key="/my.action" value="myController"></entry>
            </map>
        </property>
    </bean>
    <!-- 注意:此时的bean的id不能以 / 开头 -->
    <bean id="myController" class="com.lwj.controller.HelloWorld"></bean>
    <!-- ******************************* -->
    
        
    <!-- 注册处理器 -->
    <!-- id就是请求路径,表示请求当前这个bean -->
    <!--  *路径讲解
          *url路径:http://localhost:8080/HelloWorld/hello.action
          *  http://localhost:8080/HelloWorld/   这个称为资源路径
          *  hello.action                        资源名称
          *直接路径:能直接定位到某项资源的路径,web应用中是指带请求协议的路径,
          *相对路径:必须存在参照物的路径,
          *        以/开头:分为前台路径和后台路径,前台路径是静态页面中的,后台路径是Java代码、配置文件中
          *               前台路径/hello.action 此时 / 代表服务器根目录 http://localhost:8080/
          *               后台路径  此时 / 代表 http://localhost:8080/HelloWorld/
          *        不以/开头:直接hello.action的是相对当前访问路径的,即直接修改资源名称
          *html,jsp,js文件用里面用绝对路径
          *css内部使用的背景图片等用相对路径
            -->
    <bean id="/hello.action" class="com.lwj.controller.HelloWorld"></bean>
    
    <!-- 这种方式可以限制提交的方式,但是一般只允许POST提交时才设置 -->
    <bean id="/hello3.action" class="com.lwj.controller.HelloWorld3">
        <!-- value的值必须大写,默认是 POST,GET -->
        <property name="supportedMethods" value="POST"></property>
    </bean>
    <!-- <mvc:resources location="" mapping=""></mvc:resources> 加载静态资源-->
</beans>


myViews.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.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

	<!-- 外部资源视图类:RedirectView 内部资源视图类:JstlView 通过bean名称调用 -->
	<bean id="taobao" class="org.springframework.web.servlet.view.RedirectView">
		<property name="url" value="http://taobao.com"></property>
	</bean>
	<bean id="internal" class="org.springframework.web.servlet.view.JstlView">
		<property name="url" value="/WEB-INF/jsp/hello.jsp"></property>
	</bean>
</beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
							http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	version="2.5">
	
	<display-name>Archetype Created Web Application</display-name>
	
	<!-- 注册中央调度器 -->
	<!-- 注册中央调度器的作用是:一旦接收到.action结尾的请求,就交给DispatcherServlet来处理 -->
	<servlet>
      <servlet-name>springMVC</servlet-name>
      <servlet-class>
         org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
      <!-- 配置需要加载的springMVC配置文件的位置及名称,默认是在WEB-INF文件夹下找一个[servlet-name]-servlet.xml的配置文件 -->
      <init-param>
      	<param-name>contextConfigLocation</param-name>
      	<param-value>classpath:springMVC.xml</param-value>
      </init-param>
      <!-- tomcat启动就创建DispatcherServlet对象(这样不用请求时再创建,减少相应时间) -->
      <!-- 要设置一个大于0的整数,数越小优先级越高 -->
      <load-on-startup>1</load-on-startup>
   </servlet>

   <servlet-mapping>
      <servlet-name>springMVC</servlet-name>
      <!-- 路径过滤,中央调度器只能处理以.action结尾的控制器-->
      <!-- 不能配 /*(不能什么都丢给中央调度器来处理),原因是DispatcherServlet会把所有请求当中一个controller请求
     	         所以当然是找不到jsp页面 -->
     <!-- 最好也不要写/,因为会拦截图片请求 --> 
      <url-pattern>*.action</url-pattern>
   </servlet-mapping>
   
   <!-- 默认访问页面 -->
   <welcome-file-list>
   		<welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
</web-app>
WEB-INF 文件夹下的资源是不能通过浏览器访问的,不能重定向(因为重定向也是由浏览器发出的请求)


DispatcherServlet(中央调度器)工作原理------很重要


处理器映射器(HandlerMapping)
HandlerMapping接口负责根据request请求找到对应的处理器(Handler)和拦截器(Interceptor),并将它们封装在HandlerExecutionChain对象,然后返回给中央调度器
它有两个常用实现类:
①BeanNameUrlHandlerMapping:根据bean的name属性来找到处理器(Handler)和拦截器(Interceptor),bean的名称必须以"/"开头
function:String[] determineUrlsForHandler(String beanName)
②SimpleUrlHandlerMapping:会将请求的url与处理器映射器中的子标签的key属性匹配,匹配上后,然后再将该key的value值与bean的name匹配,这样就能准确找到对应的bean对象,这种方式可以一个bean处理多个请求,避免浪费内存

处理器适配器(HandlerAdapter)
它的作用就是统一管理所有接口
两个常用实现类:
①SimpleControllerHandlerAdapter
首先调用supports方法判断是不是Controller接口的实现类,是则强转成Controller
②HttpRequestHandlerAdapter
首先调用supports方法判断是不是HttpRequestHandler接口的实现类,是则强转成HttpRequestHandler
最后决定DispatcherServlet执行①或②的Handle方法,即执行相应的处理器

处理器(Handler)
只有表单和ajax能进行post请求,其他的全部都是get请求

ModelAndView(模型和视图)
模型:它的本质是HashMap

springMVC注解式开发

1、@Controller:控制器(注入服务)

控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示

@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。

单单使用@Controller 标记在一个类上还不能真正意义上的说它就是SpringMVC 的一个控制器类,因为这个时候Spring 还不认识它。要想让spring认识它,可以进行下面的配置。

<!--方式一:配置一个bean-->
<bean class="com.host.app.web.controller.MyController"/>
<!--方式二:使spring自动扫描指定包下的注解-->
< context:component-scan base-package = "com.host.app.web" />

2、@RequestMapping

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。RequestMapping常用的两个属性

(1)、 value, method;

value:     指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);

method:  指定请求的method类型, GET、POST、PUT、DELETE等;

3、@Resource和@Autowired

@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。

这个注解就是 spring可以自动帮你把bean里面引用的对象自动匹配并注入

@Resource

  • @Resource默认按byName自动注入。
  • 既不指定name属性,也不指定type属性,则自动按byName方式进行查找。如果没有找到符合的bean,则回退为一个原始类型进行进行查找,如果找到就注入。
  • 只是指定了@Resource注解的name,则按name后的名字去bean元素里查找有与之相等的name属性的bean。
  • 只指定@Resource注解的type属性,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常。

@Autowired

@Autowired默认先按byType进行匹配,如果发现找到多个bean,则又按照byName方式进行匹配,如果还有多个,则报出异常。

3、@Component

将普通对象实例化到spring中,通用的注解,当不知道一些类归到哪个层时使用,但是不建议。(mapper层使用)

4@Service:服务(注入dao)


5、@Repository:dao(实现dao的访问)





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值