zoukankan      html  css  js  c++  java
  • springmvc01

    三层架构

    表现层

    即web层。它负责接收客户端请求,向客户端响应结果,通常客户端使用 http协议请求web 层, web 需要接收 http 请求,完成 http 响应 。

    业务层

    service 层。它负责业务逻辑处理 。

    持久层

    dao 层。负责数据持久化,包括数据层即数据库和数据访问层 。

    springmvc组件

    DisptcherServlet 前端控制器
    dispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求, dispatcherServlet 的存在降低了组件之间的耦合性 

    HandlerMapping:处理器映射器

    HandlerMapping 负责根据用户请求找到 Handler 即处理器, SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等

    Handler:处理器
    具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行处理。


    HandlAdapter:处理器适配器
    通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用


    View Resolver:视图解析器
    View Resolver 负责将处理结果生成 View 视图, View Resolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。


    View:视图
    View 视图类型的支持,包括: jstlViewfreemarkerViewpdfView等。常用的视图就是 jsp

    处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件 ,其中在sprtingmvc.xml 使用 <mvc:annotation-driven> 自 动 加 载 RequestMappingHandlerMapping ( 处 理 映 射 器 ) 和
    RequestMappingHandlerAdapter (处 理 适 配 器 )




    参数绑定

    支持的数据类型

    基本类型参数:
      包括基本类型和 String 类型
    POJO 类型参数:
      包括实体类,以及关联的实体类
    数组和集合类型参数:
      包括 List 结构和 Map 结构的集合(包括数组)

    基本类型和String类型作为参数

    要求参数名称必须和控制器中方法的形参名称保持一致 

    1 account/findAccount?accountId=10&accountName=zhangsan
    2 
    3 
    4 String findAccount(Integer accountId,String accountName)

    POJO作为参数

    要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型

     1     <form action="param/saveUser" method="post">
     2         用户姓名 <input type="text" name="uname"/></br>
     3         用户年龄 <input type="text" name="age"/></br>
     4         用户生日 <input type="text" name="date"/></br>
     5         <input type="submit" value="提交">
     6     </form>
     7 
     8 
     9 
    10 public class User implements Serializable{
    11 
    12     private String uname;
    13     private String age;
    14     private Date date;
    15 
    16 
    17 
    18  @RequestMapping("/saveUser")
    19     public String saveUser(User user){
    20     //
    21      return  null;
    22 
    23 }

    (2) pojo中包含集合类属性

    第一种:
    要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
    List 集合中的元素赋值, 使用下标。
    Map 集合中的元素赋值, 使用键值对。


    第二种:
    接收的请求参数是 json 格式数据。需要借助一个注解实现

     1 public class Account implements Serializable {
     2 
     3     private String username;
     4     private String password;
     5     private  Double money;
     6 
     7     /**
     8      * 请求参数绑定集合类型
     9      * @return
    10      */
    11     private List<User> list;
    12     private Map<String,User> map;
    13     
    14      //  
    15 }
    16 
    17 public class User implements Serializable{
    18 
    19     private String uname;
    20     private String age;
    21     private Date date;
    22     //
    23 }
    24 
    25     
    26 
    27     <form action="param/saveAccount" method="post">
    28         姓名 <input type="text" name="username"><br/>
    29         密码 <input type="text" name="password"><br/>
    30         金额 <input type="text" name="money"><br/>
    31         //把uname封装成user对象,把对象存到map集合的key,key为one的位置上
    32         用户姓名 <input type="text" name="map['one'].uname"><br>
    33         用户年龄 <input type="text" name="map['one'].age"><br>
    34 
    35        //把uname封装成user对象,把user对象存到list集合的0位置上
    36         用户姓名2 <input type="text" name="list[0].uname"><br>
    37         用户年龄2 <input type="text" name="list[0].age"><br>
    38 
    39         <input type="submit" value="提交"/><br/>
    40     </form>
    41 
    42     @RequestMapping("/saveAccount")
    43     public String saveAccount(Account account){
    44       //
    45 
    46     
    47     return null;
    48 
    49 }            

    自定义类型转换器

    日期类型转换器

    1.实现Converter<S,T>接口

     1 public class ToDateConverter implements Converter<String,Date>{
     2     @Override
     3     public Date convert(String source) {
     4         if (source == null) {
     5             throw new RuntimeException("传入了空数据");
     6         }
     7         DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
     8         try {
     9             return df.parse(source);
    10         } catch (Exception e) {
    11            throw new RuntimeException("数据类型错误");
    12         }
    13 
    14     }
    15 }

    2.修改spring配置文件配置类型转换器

    1     <!--配置自定义类型转换器-->
    2     <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
    3         <property name="converters">
    4             <set>
    5                 <bean class="com.xxx.util.ToDateConverter"></bean>
    6             </set>
    7         </property>
    8     </bean>

    3.annotation-driven 标签中引用配置的类型转换服务

    1  <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>

    常用注解

    RequestMapping 

    用于建立请求 URL 和处理请求方法之间的对应关系,url进行模块化管理

    1 @Target({ElementType.METHOD, ElementType.TYPE})
    2 @Retention(RetentionPolicy.RUNTIME)
    3 @Documented
    4 @Mapping
    5 public @interface RequestMapping {
    6 }

    value:用于指定请求的 URL。 它和 path 属性的作用是一样的
    method:用于指定请求的方式

    params:用于指定限制请求参数的条件。 它支持简单的表达式。 要求请求参数的 key value 必须和配置 一致
    headers:用于指定限制请求消息头的条件


    Requestparam

    把请求中指定名称的参数给控制器中的形参赋值 (参数名称和控制器中方法的形参名称不一致的情况 )
    value: 请求参数中的名称。
    required:请求参数中是否必须提供此参数。 默认值: true

    1 user/Param?name=test"
    2 
    3 public String Param(@RequestParam("name")String username){
    4 
    5 return null;
    6 }

    RequestBody

    用于获取请求体内容。 直接使用得到是 key=value&key=value...结构的数据。get 请求方式不适用。
    required:是否必须有请求体。默认值是:true。当取值为 true ,get 请求方式会报错。如果取值
    falseget 请求得到是 null

    可以将请求体中的JSON字符串绑定到相应的bean上

     1 <form action="springmvc/useRequestBody" method="post">
     2 用户名称: <input type="text" name="username" ><br/>
     3 用户密码: <input type="password" name="password" ><br/>
     4 用户年龄: <input type="text" name="age" ><br/>
     5 <input type="submit" value="保存">
     6 </form>
     7 
     8 <a href="user/useRequestBody?body=test">requestBody 注解</a>
     9 
    10 @RequestMapping("/useRequestBody")
    11 public String useRequestBody(@RequestBody(required=false) String body){
    12 System.out.println(body);
    13 return null;
    14 }
    15 
    16 
    17 //username=aaa&password=111&ge=111

    PathVaribale


    用于绑定 url 中的占位符
    value: 用于指定 url 中占位符名称。
    required:是否必须提供占位符。

    1 <a href="user/usePathVariable/100">pathVariable 注解</a>
    2 
    3 @RequestMapping("/usePathVariable/{id}")
    4 public String usePathVariable(@PathVariable("id") Integer id){
    5   System.out.println(id);
    6   return null;
    7 }

    ModelAttribute

    出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。

    出现在参数上,获取指定的数据给参数赋值 (当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据 

     

    属性:
    value:用于获取数据的 keykey 可以是 POJO 的属性名称,也可以是 map 结构的 key

     

     1 <form action="user/updateUser" method="post">
     2 用户名称: <input type="text" name="username" ><br/>
     3 用户年龄: <input type="text" name="age" ><br/>
     4 <input type="submit" value="保存">
     5 </form>
     6 
     7 @RequestMapping("/updateUser")
     8 public String testModelAttribute(@ModelAttribute("abc")User user) {
     9 
    10     return null;
    11 }
    12 
    13 private User findUserByName(String username) {
    14 User user = new User();
    15 user.setUsername(username);
    16 user.setAge(19);
    17 user.setPassword("123456");
    18 return user;
    19 
    20 }
    21 
    22 //username值默认没有修改

    ResponseBody

    该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数据

    如: json,xml 等,通过 Response 响应给客户端

    返回值类型

    字符串

    void

    ModelAndView

    字符串

    controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址
    指定逻辑视图名,经过视图解析器解析成jsp物理路径

    void

    controller 方法形参上可以定义 request response,使用 request response 指定响应结果 

    使用request转向页面

    request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);


    通过 response 页面重定向

    response.sendRedirect("testRetrunString")


    通过 response 指定响应结果, 例如响应 json 数据:
    response.setCharacterEncoding("utf-8");
    response.setContentType("application/json;charset=utf-8");
    response.getWriter().write("json 串");


    ModelAndView

    ModelAndView SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值

    1     public void setViewName(@Nullable String viewName) {
    2         this.view = viewName;
    3     }
    4 
    //1.用于设置逻辑视图名称,视图解析器会根据名称前往指定的视图
    6 public ModelAndView addObject(String attributeName, Object attributeValue) { 7 getModelMap().addAttribute(attributeName, attributeValue); 8 return this; 9 }
    //2.添加模型到对象中,页面上可直接用el表达式获取

     

    转发&&重定向

    forward转发

    路径必须写成实际视图 url,不能写逻辑视图。

    1 return "forward:/WEB-INF/pages/success.jsp"
    2 
    3 相当于“request.getRequestDispatcher("url").forward(request,response)” 。使用请求
    4 转发,既可以转发到 jsp,也可以转发到其他的控制器方法

    redirect重定向

    contrller 方法提供了一个 String 类型返回值之后, 它需要在返回值里使用:redirect:

    1 return "redirect:testReturnModelAndView";
    2 
    3 
    4 相当于“response.sendRedirect(url)”  如果是重定向到 jsp 页面,则 jsp 页面不
    5 能写在 WEB-INF 目录中,否则无法找到

     

  • 相关阅读:
    Android Camera Api的心得
    apache禁止訪问某些文件或文件夹的方法
    查询和删除数据表中反复数据的sql
    设计模式C++实现——外观模式
    排序(杭电1106)
    《JAVA程序设计》实训第一天——《猜猜看》游戏
    CSS3选择器(全)
    【原创】TCP超时重传机制探索
    使用Win32 API实现生产者消费者线程同步
    翻翻git之---溜的飞起的载入效果AVLoadingIndicatorView
  • 原文地址:https://www.cnblogs.com/quyangyang/p/11847688.html
Copyright © 2011-2022 走看看