统计
  • 建站日期:2021-03-10
  • 文章总数:518 篇
  • 评论总数:151 条
  • 分类总数:32 个
  • 最后更新:4月20日
文章 代码笔记

SpringMvc框架注解,自定义类型转换,乱码过滤器,常用注解

梦幻书涯
首页 代码笔记 正文

package com.sise.controller;


import com.sise.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.annotation.RequestScope;

import java.lang.reflect.Method;

@Controller()
@RequestMapping("/testController")
public class TestController {

    @RequestMapping("/hello")
    public String sayHello(){
        System.out.println("TestController---sayHello");
        return "success";
    }
/*@RequestMapping的作用
*  value:用于指定请求的URL。
* 它和path属性的作用是一样的。
* method:用于指定请求的方式。
* params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样。
*               例如:params = {"accountName"},表示请求参数必须有accountName
*                     params = {"moeny!100"},表示请求参数中money不能是100。
*
* saveUsername(User user)-->
*       办法里面的参数可以javabean,里面name变量的值跟属性一模一样,区分大小写
*       姓名:<input type="text" name="username" /><br/>
        密码:<input type="text" name="password" /><br/>
        金额:<input type="text" name="money" /><br/>
*
*        或者Map,list,里面name变量的值跟属性一模一样,区分大小写
*       用户姓名:<input type="text" name="list[0].uname" /><br/>
        用户年龄:<input type="text" name="list[0].age" /><br/>
        用户姓名:<input type="text" name="map['one'].uname" /><br/>
        用户年龄:<input type="text" name="map['one'].age" /><br/>
*
*      也可以是User类中的Acount类对象acount,里面name变量的值跟属性一模一样,区分大小写
*      用户姓名:<input type="text" name="user.uname" /><br/>
       用户年龄:<input type="text" name="user.age" /><br/>
       *
* headers:用于指定限制请求消息头的条件。
*
*
* */

 

    @RequestMapping(value = "/saveUsername",method = RequestMethod.GET,params =  {"user"})
   /* @RequestBody
   * 作用:
   用于获取请求体内容。直接使用得到是 key=value&key=value...结构的数据。
   * 必须是POST请求才有请求体,GET请求体为null,
   * 所谓的请求体就是访问链接url中的请求参数----》key=value&key=value...
   get 请求方式不适用。
   属性:
         required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值
         为 false,get 请求得到是 null。
*/

 

/*
   @PathVariable
作用:
用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。
url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。
属性:
value:用于指定 url 中占位符名称。
required:是否必须提供占位符。

<a href="springmvc/usePathVariable/100">pathVariable 注解</a>
@RequestMapping("/usePathVariable/{id}")//链接地址和RequestMapping格式一样
public String usePathVariable(@PathVariable("id") Integer uid){
也就是将id=100的值赋值给uid
System.out.println(id);100

return "success";
} */

 

/*
    @RequestHeader
    作用:
         用于获取请求消息头。
      属性:
         value:提供消息头名称
         required:是否必须有此消息头
注:
在实际开发中一般不怎么用。

public String useRequestHeader(@RequestHeader(value="Accept-Language",
required=false)String requestHeader){
System.out.println(requestHeader);
return "success";
}

    */

 


    /*
    @RequestParam
    作用:
    把请求中指定名称的参数给控制器中的形参赋值。

    value:请求参数中的名称。
    required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。
    <a href="springmvc/useRequestParam?name=test">requestParam 注解</a>

    public String useRequestParam(@RequestParam("name")String username,
    属性:    @RequestParam(value="age",required=false)Integer age){
    System.out.println(username+","+age);
          return "success";
          因为value="age",required=false,所以age有没有值都正常,如果改成true,则出错,因为age为空
}
运行
    */
/*
    @ModelAttribute
作用:
该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。
出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可
以修饰有具体返回值的方法。
出现在参数上,获取指定的数据给参数赋值。
属性:
value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。


@ModelAttribute
public void showModel(User user) {
System.out.println("执行了 showModel 方法"+user.getUsername());
}

    @RequestMapping("/testModelAttribute")
    public String testModelAttribute(User user) {
        System.out.println("执行了控制器的方法"+user.getUsername());
        return "success";
    }

    输出内容--------》执行了 showModel 方法"+user.getUsername()
                     执行了控制器的方法"+user.getUsername()
                     也就是@ModelAttribute作用在showModel办法上就先执行showModel
                     在执行testModelAttribute这个办法

                     应用场景:
当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
例如:
我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数
据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。

User中有username,age,data,
一个表单中,如果注册日期data不可以修改,那么你在改变该表数据username,age中
就可以利用这个ModelAttribute放在一个办法前,来获取原来数据库表User的值,然后授予在传输数据的(User user),
          user中,那么user中就有自己原来的注册时间了

          它可以修饰没有返回值的方法,也可
以修饰有具体返回值的方法。

    一般修饰没有返回值的办法都会将相关的值添加在map结构中,再利用
    @ModelAttribute
    public void showModel(String username,Map<String,User> map) {
//模拟去数据库查询
User user = findUserByName(username);
System.out.println("执行了 showModel 方法"+user);
          map.put("abc",user);添加user对象后,再@ModelAttribute("abc")User user,通过key查出对象再赋值
}
@RequestMapping("/updateUser")
public String testModelAttribute(@ModelAttribute("abc")User user) {
System.out.println("控制器中处理请求的方法:修改用户:"+user);
return "success";
}

*/

/*
@SessionAttribute
作用:
用于多次执行控制器方法间的参数共享。
属性:
value:用于指定存入的属性名称
type:用于指定存入的数据类型。

<!-- SessionAttribute 注解的使用 -->
<a href="springmvc/testPut">存入 SessionAttribute</a>
<hr/>
<a href="springmvc/testGet">取出 SessionAttribute</a>
<hr/>
<a href="springmvc/testClean">清除 SessionAttribute</a>

 

@RequestMapping("/testPut")
public String testPut(Model model){
 model.addAttribute("username", "泰斯特");
 model.addAttribute("password","123456");
 model.addAttribute("age", 31);
 //跳转之前将数据保存到 username、password 和 age 中,因为注解@SessionAttribute 中有
这几个参数
 return "success";
 }

 

 @RequestMapping("/testGet")
 public String testGet(ModelMap model){

System.out.println(model.get("username")+";"+model.get("password")+";"+model.get("a
ge"));
 return "success";
 }

 

 @RequestMapping("/testClean")
 public String complete(SessionStatus sessionStatus){
 sessionStatus.setComplete();
 return "success";
 }


*/

/*
*
*共同点:
它们都是表现层框架,都是基于 MVC 模型编写的。
它们的底层都离不开原始 ServletAPI。
它们处理请求的机制都是一个核心控制器。
区别:
Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter
Spring MVC 是基于方法设计的,而 Struts2 是基于类,Struts2 每次执行都会创建一个动作类。所
以 Spring MVC 会稍微比 Struts2 快些。
Spring MVC 使用更加简洁,同时还支持 JSR303, 处理 ajax 的请求更方便
(JSR303 是一套 JavaBean 参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注
解加在我们 JavaBean 的属性上面,就可以在需要校验的时候进行校验了。)
Struts2 的 OGNL 表达式使页面的开发效率相比 Spring MVC 更高些,但执行效率并没有比 JSTL 提
升,尤其是 struts2 的表单标签,远没有 html 执行效率高。
*
*
*
*
*
*
*3.1.4.4 请求参数乱码问题,就是表单中有中文,再post形式就会出现乱码??
* 我们就需要再web.xml设置过滤器
* get形式不出现中文乱码问题
*
* post 请求方式:
在 web.xml 中配置一个过滤器
<!-- 配置 springMVC 编码过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
*
* <!-- 设置过滤器中的属性值 就是如果出现乱码问题,直接转换成utf-8字符集,就不会乱码了-->
<init-param>
<param-name>encoding</param-name>
 <param-value>UTF-8</param-value>
</init-param>
<!-- 启动过滤器 -->
<init-param>
<param-name>forceEncoding</param-name>
 <param-value>true</param-value>
</init-param>
</filter>
<!-- 过滤所有请求 -->
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


在 springmvc 的配置文件中可以配置,静态资源不过滤:
<!-- location 表示路径,mapping 表示文件,**表示该目录下的文件以及子目录的文件 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/scripts/" mapping="/javascript/**"/>

 */
/*
3.2.1 自定义类型转换器

简单点想把目标字符集转换成日期
,假如系统能识别  2018-10-05,自动转换成日期Date格式

  但是系统无法识别    2018/10/05,那么就不会转换成日期
  那么我们就要 自己定义一个类型转换器,如何将这样的字符集转换成date


  <!-- 特殊情况之:类型转换问题 -->
<a href="account/deleteAccount?date=2018-01-01">根据日期删除账户</a>

 public class StringToDateConverter implements Converter<String, Date> {
//第一步:定义一个类,实现 Converter 接口,该接口有两个泛型。
//S:表示接受的类型,T:表示目标类型


用于把 String 类型转成日期类型
    @Override
    public Date convert(String source) {
        DateFormat format = null;
        try {
            if(StringUtils.isEmpty(source)) {
                throw new NullPointerException("请输入要转换的日期");
            }
            format = new SimpleDateFormat("yyyy-MM-dd");
            Date date = format.parse(source);
            return date;
        } catch (Exception e) {
            throw new RuntimeException("输入日期有误");
        }
    }
}


再到spring.xml配置自定义类型转换器
spring 配置类型转换器的机制是,将自定义的转换器注册到类型转换服务中去。

 

<!-- 配置类型转换器工厂 -->
<bean id="converterService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<!-- 给工厂注入一个新的类型转换器 -->
 <property name="converters">
 <array>---》   <set>   </set>这个标签也可以,就是将下面的自定义类型转换器添加到服务中
 <!-- 配置自定义类型转换器 -->
 <bean class="com.itheima.web.converter.StringToDateConverter"></bean>
 </array>
 </property>
</bean>
第三步:在 annotation-driven 标签中引用配置的类型转换服务
<!-- 引用自定义类型转换器 -->
<mvc:annotation-driven
conversion-service="converterService"></mvc:annotation-driven>
 */

/*
 Servlet原生的API
 <a href="param/testServlet">Servlet原生的API</a>
*  @RequestMapping("/testServlet")
    public String testServlet(HttpServletRequest request, HttpServletResponse response){}
*
*
* */

 


    @RequestScope
    public String saveUsername(User user){
        System.out.println("TestController---saveU121233sername");
        System.out.println(user);
        return "success";
    }
}
/*
* @Controller
@RequestMapping(value = "/commoms")
public class CommomsNodes {

    @RequestMapping(path = "/testRequestmapping", params = {"username", "password", "age"}, method = {RequestMethod.GET, RequestMethod.POST})
    public String testRequestmapping(@RequestBody String body) {
        System.out.println(body);
        return "success";
    }

    @RequestMapping(path = "/testRequestBody")
    //必须有请求体(也就是带有请求参数),而且get请求不可以
    public String testRequestBody(@RequestBody String body) {
        System.out.println(body);
        return "success";
    }

    @RequestMapping(path = "/testRequestHeader")
    public String testRequestHeader(@RequestHeader(value = "Accept") String header) {
        System.out.println(header);
        return "success";
    }

    @RequestMapping(path = "/testCookieValue")
    public String testCookieValue(@CookieValue(value = "JSESSIONID") String id) {
        System.out.println(id);
        return "success";
    }

    @RequestMapping(path = "/testPathVariable/{sid}")
    public String testPathVariable(@PathVariable(value = "sid") String id) {
        System.out.println(id);
        return "success";
    }

    @RequestMapping(path = "/testModelAttribute1")
    public String testModelAttribute1(@ModelAttribute(value = "userbean") Userbean userbean) {
        System.out.println(userbean);
        return "success";
    }

    @RequestMapping(path = "/testModelAttribute2")
    public String testModelAttribute2(Userbean userbean) {
        System.out.println(userbean);
        return "success";
    }

    @ModelAttribute
    public Userbean saveModelAttibute() {
        Userbean userbean = new Userbean();
        userbean.setAddress("雷州返回Userbean");
        userbean.setId(1);
        userbean.setUsername("wangcx");
        return userbean;
    }

    //@ModelAttribute
    public void saveModelAttibute(Map<String, Userbean> map) {
        Userbean userbean = new Userbean();
        userbean.setAddress("雷州返回void");
        userbean.setId(1);
        userbean.setUsername("wangcx");
        map.put("userbean", userbean);
    }

    @RequestMapping("/testServletApiMap")
    public void testServletApiMap(HttpServletRequest request, HttpServletResponse response) {
        String method = request.getMethod();
        System.out.println(method);
    }

    @RequestMapping("/testAddModel")
    public void testAddModel(Model model,HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
        Userbean userbean = new Userbean();
        userbean.setAddress("雷州testModel");
        userbean.setId(1);
        userbean.setUsername("wangcx");
        model.addAttribute(userbean);
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/WEB-INF/pages/success.jsp");
        System.out.println("testforward");
        requestDispatcher.forward(request,response);
    }

    @RequestMapping("/testGetModel")
    //当办法为void,如果没有转发或者重定向到别的页面,它就会自动跳转到testGetModel.jsp,也就是设置事什么就是什么
    public void testGetModel(ModelMap modelMap) {
        Userbean userbean = (Userbean) modelMap.get("userbean");
        System.out.println(userbean);
    }

    @RequestMapping("/testdeleteModel")
    public void testdeleteModel(SessionStatus status) {
        status.setComplete();
    }
*
*
* */

 

版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。
版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!

这篇文章最后更新于2020-8-8,已超过 1 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!
SpringMvc请求转发,重定向,ModelAndView,JSon数据的响应,和ajax的使用,以及Springmvc.xml配置
« 上一篇
SpringMVC 和 Struts2 的优略分析
下一篇 »

发表评论

HI ! 请登录
注册会员,享受下载全站资源特权。
Array

日历

热门文章