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层使用)
aaa@qq.com:服务(注入dao)
5、@Repository:dao(实现dao的访问)
上一篇: 编程输出九九乘法表
下一篇: 微信红包春节将有大变化:这才叫人情味