miwaiwai

导航

SpringMVC开发流程

1.jar包

  spring-aop.jar

  spring-bean.jar

  spring-context.jar

  spring-core.jar

  spring-web.jar

  spring-webmvc.jar

2.创建项目:Dynamic Web Project

 

  第一个SpringMVC程序

  Servet------Springmvc

  jsp--->Servlet-->Jsp

springmvc配置文件和spring的配置文件一样,名字:springmvc.xml

 

 

选中常用的命名空间:beans, aop,context,mvc

 

 普通的servlet流程:

  请求---->url--->pattern---->交给对应的servlet处理

3.如果现在想用springmvc,而不是普通的servlet.如何告知程序?如何让springmvc介入程序,则需要配置一个springmvc的jar里面自带的servlet,这个servlet叫:DispatcherServlet.class

 

4.配置springmvc自带的servlet,同时也是通过一下配置拦截所有请求,交给servlet处理,也是mvc的入口,下面这个图片是配置servlet

 其中:<url-pattern>/</url-pattern>

      /:表示一切请求,注意不是/*

      /user:拦截以user开头的请求

      /user/abc.do:只拦截该请求

<url-pattern>.action</url-pattern>:表示是只能拦截.action结尾的请求

 5.配置springmvc的配置文件             显示指定springmvc的配置文件   

 

                            下面是默认方式,只要放在指定的目录,使用指定的文件名即可:/WEB-INF/springDispatcherservlet-servlet.xm


注意:包的命名org.xxx.servlet

      org.xxx.controller

      org.xxx.handler

      org.xxx.action

    这三个包都是控制器的命名,根据个人习惯而已

 

6.做一个简单的前后端交虎的:

      html前端:

 

  

        controller拦截:

                        前端为:下面的是多层映射

 

                        controller为:主要是注解要和前端html里面的映射一致,可以和类名不一致

                        映射是去匹配@RequestMapping注解,可以和类名和方法不一样.页面使用的是请求转发的方式,不是重定向

 

7.配置扫描器

 

 

 8.配置视图解析器

下面是视图解析器在流程中的作用

 

注意:NoClassFoundError:如果报这样的 错误,表示缺少jar包 

 

 

 

9.REST风格:软件编程风格

  Springmvc:

    GET:查   

    POST:增加

    DELETE:删除

    PUT:改

 普通浏览器只支持get post发方式,其它请求方式;其他请求方式如delete|put请求是通过过滤器新加入的支持

 springmvc实现:put/post请求方式的步骤:

  1>通过增加过滤器支持

  

    2>表单的前端是通过隐藏域实现的

    

 

     注意:

      1>必须是post

      2>通过隐藏域的 value值,设置实际的请求方式DELETE|PUT

     3.java类的控制器

      

     通过method=RequestMethod.DELETE 匹配具体的请求方式

    此外,可以发现,当映射名相同@RequestMapping(value="testRest"),可以通过method指定不同的请求.

   过滤器中处理put|delete请求的部分源码:

原始请求:request,该请求默认只支持get,post,header,但是,如果是"POST"并且有隐藏域

  <input type="hidden" name="_method" value="DELETE">

则,该过滤器将原始的request加入新的请求方式DELETE,并将原始请求转为requesttToUse请求(request+Delete,也就是变成了2个请求),最后将requestToUse放入请求链中,

后续再使用request时,实际就使用改造后的requestToUse

  这个注解是接收从前端接收到的表单数据:@RequestParam("uname") String name,@RequestParam(value="uage",required=false,defaultValue="23")

                    @RequestParm("uname"):接受前端传递的值,等价于request.getParameter("uname")

                    required=false:该属性不是必须的

                    defaultValue="23":默认值23

    获取请求信息:@RequestHeader()

    public String testRequestHeader(@RequestHeader("Accept-Language") String a1)

通过@RequestHeader("Accept-Language") String a1获取请求头中的Accept-Language值,并将值保存在a1变量中

cookie   --------session

存在客户端      存在服务器端

通过mvc获取cookie值(JESSIONID)

@CookieValue

(前置知识:服务端在接受客户端第一次请求时,会给客户端分配一个session(该session包含一个sessionID)),并且服务端在第一次响应客户端时,并将该sessionID赋值给JSESSIONID并传递给客户端

小结:

  SpringMVC处理各种参数的流程/逻辑

  1.前端发请求a--->@RequestMappting("")

    每个请求---------方法

  2.处理请求中的参数

    @RequestMappting("a")

    public String aa(@Xxxx注解("xyz")    xyz){

 

 

    }

使用对象(实体类对象Student)接受请求参数

在SpringMVC中使用原生态的Servlet API:HttpServletRequest;直接将servlet-api中的类,接口等,写在mvc中方法中的座位参数即可,然后就可以使用了

    @RequestMapping(value="testServletAPI")

    public String testServletAPI(HttpServletRequest request,HttpServletResponse repons){

      request.getParameter("uname");

      System.out.println(request);

      return "success";

    }

处理模型数据:

  如果跳转时需要带数据:V,M则可以使用以下方式:

  ModelAndView,ModelMap,Map       --数据放在request作用域

  @SessionAttribute,@Mode7lAttribute

  方式一:ModelAndView

 

 

      前端success.jsp通过EL表达去取数据,在requestScope对象里面去取

 

     ModelMap,Map 这两种传递数据的方法是:

 

    示例:

    public String testModel(Model model|Map<String Object> m){

    m.put(x,"...")就会将x对象放入request域中

    }

    如何将上述数据放入session中?只需要增加一个@SessionAttributes()注解即可,这个注解要加在类的上面

 

 

  通过类型来放入session作用域

@ModelAttribute经常在更新时使用

 

 

 

 

如果ModelAttribute的map的key后后面的@RequestMapping的参数类型不一致,可以通过注解进行对应

    @ModelAttribute经常在更新时使用,在不改变原有代码功能的基础上增加新功能,均被执行一次,因此使用时需要注意

    通过@ModelAttribute修饰的方法,会在每次请求前先执行,并且该方法的参数map.put()方法将对象放入下次查询的参数中

    必须满足的约定:

      map.put(k,v)期中的k必须是即将查询的方法参数的首字母小写

      testModelAttribute(@ModelAttribute("stu")Student student){

                    },即student;如果不一致,需要通过@

2.视图,视图解析器

  视图的顶级接口:view

  视图解析器:ViewResolver

  常见的视图解析器:

    InternalResourceView,

    InternalResourceViewResolver

    public class JstlView extends InternalResourceView:springMVC解析jsp时,会默认使用InternalResourceView,如果发信jsp中包含了jstl语言,则自动转换JstlView

      国际化:针对不同地区,不同国家,进行不同的显示

    JstView 可以解析为可以解析jstl\实现国际化操作

具体实现国际化步骤:

    1>创建资源文件

      基名_语言_地区.properties

      基名_语言.properties

      i18n/base

    2>配置springmvc.xml,加载资源文件

      <!---加载国际化资源文件->

      <bean id="messageSource" class="org.springframework.context.support.ResourceBundMessageSource"> 这个id必须是messageSource,写死的,这个springmvc规定的

      <property name="basename" value="i18n"></property>

      ResourceBundMessageSoure会在springmvc响应程序时介入(解析国际化资源文件)

    3>使用

      通过jstl使用国际化

        jstl.jar

        standwd.jar

      在页面里面引进jstl

        <%@taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>

        <fmt:message key="resource.welcome"></fmt:message>

        <fmt:message key="resource.exist"></fmt:message>

 InternalResourceViewResolver其他功能:

 1. index.jsp----->Controller(@RequestMapping)------->success.jsp

  要用SpringMVC实现:  index.jsp----->success.jsp

   <mvc:view-Controller path="handler/welcome" view-name="success"/>

以上注解,会让所有的请求转入<mvc:..>中匹配映射地址,而会忽略调用@RequestMapping();

如果想让@RequestMapping("a")和<mvc:..>共存,则需要加入一个注解,则需要再springmvc的配置文件增加<mvc:annotation-driven></mvc:annotation-driven>

  2.指定跳转方式:return "forwar:/views/success.jsp":

  forward: redirect需要注意,此种方式不会被视图解析器加上前缀和后缀

  3.处理静态资源:html css js 图片 视频

  可以与用户交互,因为时间/地点的不同而结果不同的内容:动态(百度:天气)

  在springMVC中,如果直接访问静态资源:直接404错误.

    原因:之前将所有的请求通过通配符"/"拦截了,进而交给SpringMVC的入口DispatcherServlet去处理:找该请求对应的映射的@RequestMapping()

  解决:如果是需要mvc处理的,则交给@requestMapping("img.png")处理:如果不需要springmvc处理的,交给tomcat服务器默认的servlet进行处理;如果有对应的请求拦截,则交给相应的Servlet去处理,如果没有对应的servlet,那么直接访问

    tomcat默认的Servlet在哪里?在tomcat配置文件\conf\web.xml中

    例如:abc  

     <servlet>

        <servlet-name>abc</servlet-name>

        <servlet-class>xxx.xxx.xx.ABCServlet</servlet-class>

     </servlet>

     <servlet-mapping>

      <servlet-name>abc</servlet-name>

      <url-pattern>/abc</url-pattern>

     </servlet-mapping>

解决静态资源方案:如果有springmvc对应的@RequestMapping则交给spring处理;如果没有对应的@requestMapping,则交给服务器tomcat默认的servlet去处理

  实现方法:只需要增加一个配置即可,在springmvc.xml:

    <!--该注解会让springmvc:接收一个请求,并且该请求没有对应的@RequestMapping,那么tomcat就会让默认的servlet进行处理,直接访问-->

    <mvc:default-servlet-handler></mvc:default-servlet-handler>

    <mvc:annotation-driven></mvc:annotation-driven>

  总结:要让springmvc访问静态资源,只需要加入以上2个注解

 

4.类型转换

  1>Spring自带一些常见的类型转换器

    public Sring testDelete(@PathVariable("id") String id),即可以接受int类型数据id,也可以接受String类型的id,自带类型转换器

  2>也可以自定义类型转换器

    a>编写自定义类型转换器的类(需要实现Converter接口)

 

    b>配置:

      将MyConverter加入到springmvc中

         步骤1:将自定义转换器纳入springIOC容器

      <bean id="myConverter" class="org.lanqiao.comverter.MyConverter"></bean>

        步骤2:将myConverter再纳入SpringMVC提供的转换器Bean

      <bean class=""org.springframework.context.support.ConversionServiceFactoryBean">

        <property name="converters">

          <set>

            <ref  bean="myConverter"/>

          <set>

        </property>

      </bean>

  

      步骤3;将conversionServer注册到annotation-driven中

 

    4.测试转换器

      期中@RequestParam(""studentInfo")是触发转换的桥梁:

      @RequestParam("studentInfo")的数据是前段传递过来的:2-zs-33,但是需要将该数据复制给修饰的目的对象Student;因此SpringMVC可以发现接收到数据和目标数据不一致,并且

    这两种数据分别是String,Student,正好符合public Student convert(String source)

5.数据格式化

  SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss")

  SprinfMVC提供了很多注解,方便我们数据格式化

    实现步骤:

      1.在springmvc.xml配置数据格式化所依赖的bean

      <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"></bean>

      2.通过注解使用

           @DateTimeFormat(pattern="yyyy-MM-dd")

          @NumberFormat(parttern="###,#")  //123,4

  JSTL有2个jar:

    1.jstl-1.2.jar

    2.standard-1.1.2.jar

   在jsp页面里面导入jstl库

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c">

  1.错误消息:

  public String testDateTimeFormat(Student student,BindingResult result,Map<String,Object> map)

  需要验证的数据是Student中的birthday,SpringMVC要求,如果校验失败,则将错误信息自动放入该对象之后紧挨着的BindingResult中

  即Student student,BindingResult result之间不能有其它参数

  如果要将控制台的错误消息传到jsp中显示,则可以将错误消息对象放入request域中,然后在jsp中从requestScope中获取

2.数据校验

  JSR303提供的标注注解:

  HIbernate Validator是对JSR303的扩展

    @Null 被注释的元素必须为null

    @NotNull 被注释的元素必须补位null

    @AssertTrue 被注释的元素必须为True

    @AssertFalse 被注释的元素必须为false

    @Min(value)被注释的元素必须是一个数字,其值必须大于或等于value

    @Max(value)被注释的元素必须是一个数字,其值必须小于或等于value

    @DeximalMin(value) 被注释的元素必须是一个数字,其值必须小于或等于value

    @DecimalMax(value)被注释的元素必须是一个数字,其值必须小于或等于value

    @Size(max,min)被注释的元素的取值范围必须是介于min和max之间

    @Digits(integer,fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内

    @Past 被注释的元素必须是一个过去的日期

    @Future 被注释的元素必须是一个将来的日期    

   Hibernate Validator 是JSR303的扩展,Hibernaet Validator提供了JSR303中所有内置的注解,以及自身扩展的4个注解:

    @Email被注解的元素值必须是合法的电子邮箱地址

    @Length 被注释的字符串的长度必须在指定的范围内

    @NotEmpty被注释的字符串必须非空

  使用Hibernate Validator步骤:

    1.jar包

      hiberante-validator.jar

      classmate.jar

      jboss-logging.jar

      validatetion-api.jar

      hibernate-validator-annotation-processor.jar

  2.

 

  

 

 

 

 

 

 

 

  

 

 

 

 

 

 

 

 

 

 

 

 

  

 

posted on 2024-01-23 15:53  米歪歪  阅读(7)  评论(0编辑  收藏  举报