SpringWeb层控制器类的使用

Springweb搭建中,引入创建了Controller控制类,可以编写自己的代码,实现前后端交互,那么如何使用呢?

搭建控制器类

@RestController ,表示此类是控制层类,并创建对象;
@RequestMapping ,处理请求地址映射,可用于类或方法上;
该标签中的属性:
path/value:可设置请求的路径,映射地址,为类设置地址时必须是唯一的,为方法设置时,同一个类中的地址也必须是唯一的;
method:可设置请求的方式(post/get) ,如果注解标签中未设置该属性说明post或get请求都可以访问;
@GetMapping,相当于 @RequestMapping (method =RequestMethod.GET) ,也可以设置映射地址与@RequestMapping相同;
@PostMapping,相当于 @RequestMapping (method =RequestMethod.POST),也可以设置映射地址与@RequestMapping相同;

@RestController
@RequestMapping(path = "/loginCtl")
public class LoginController {

        @GetMapping(path = "/login")
//相当于@RequestMapping(path = "login",method = RequestMethod.GET)
    public void login(){
     ......
    }
}

接收请求中的数据

1.在学习Servlet,获取前端返回的参数时,使用的是 req.getParameter() 方法,在Spring框架中,也可以使用该方法获取参数。在使用前需要导入jar包即可:

<!--javax.servlet-api-->
       <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
       </dependency>

2.可以在参数列表中定义形参接收;
如果请求中的名字与形参名字一致时,直接就可以定义参数,从参数列表中获取到,如果不一致时,可以使用@RequestParam注解标签来标注:

 //名字一致时:请求和参数的名字都为num
    public void login(Integer num){
        System.out.println(num);
    }
    //名字不一致时:请求中的名字为:user-name  参数名字为:userName
    public void login1(@RequestParam("user-name") String userName){
        System.out.println(userName);
    }

也可通过@RequestHeader注解标签来获取请求头中的数据;

 public void login2(@RequestHeader("User-Agent") String userAgent){
        System.out.println(userAgent);
    }

3.请求中的数据过多时,可以使用对象接收;
这种方式通常就是将参数放在一个实体中,然后只需要在控制器方法上定义这个实体为参数即可;

public void test(Admin admin){
        System.out.println(admin);
    }

注意:
如果请求中有关于日期的数据时,需要在日期上添加一个@DateTimeFormat注解标签,指定了 Date 类型的格式。

@DateTimeFormat(pattern="yyy-MM-dd")
private Date birthday;

中文乱码处理

当前端发送的请求为post请求时,如果输入中文,会产生中文乱码;处理的方法就是设置一个过滤器,为 request 对象设置编码集。Spring框架中已经提供了这个过滤器,只需要在web.xml中配置即可。

<!--配置Spring框架提供的一个编码过滤器-->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <!--设置字符集编码-->
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

Ajax 返回 JSON

在创建控制器类时,使用了@RestController注解标签,该标签中包含了@ResponseBody标签,所以方法返回的结果默认是JSON格式,并将json字符串写入到响应体中返回一个对象时,必须加入转json的jar包。

<!--jackson-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.3</version>
        </dependency>

跨域处理

1.导入相关的jar包;

<!--跨域-->
        <dependency>
            <groupId>com.thetransactioncompany</groupId>
            <artifactId>cors-filter</artifactId>
            <version>2.5</version>
        </dependency>

2.配置跨域过滤器;

<!--配置跨域处理过滤器-->
    <filter>
        <filter-name>CORS</filter-name>
        <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CORS</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

拦截器

1.概念

提到拦截器,就会想到与它相似的过滤器,过滤器时java Servlet规范中定义的,是当请求进入到servlet之前,可以对请求进行拦截,可以加入一些逻辑处理。
但拦截器是Spring框架自己定义的功能,它与过滤器是有区别的,两者存在的位置不同,过滤器是在请求进入到servlet之前,而拦截器是只拦截进入到控制器中的请求,其余的不拦截,可以说是拦截器在过滤器之后。

2.搭建

①创建一个类,实现HandlerInterceptor接口;
②重写接口中的preHandle方法;

public class TokenInterceptor implements HandlerInterceptor {

    /*
        预处理
        当请求经过映射处理器并检测到对应的控制器是存在的
        判断该请求可以进入到该拦截器,执行调用
        返回true-->请求继续向下执行
        返回false-->请求不在继续向下执行
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        return true;
    }

   /*
   在mvc架构中使用的
   当控制器执行完成后,调用
   @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    当响应结束后执行
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }*/
}

③在spring-mvc.xml中配置拦截器;

<!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="..."/><!--配置哪些请求进入到拦截器-->
            <mvc:exclude-mapping path="..."/><!--配置哪些请求不进入拦截器-->
            <bean class="拦截器全类名"></bean><!--配置拦截器实现类-->
        </mvc:interceptor>
    </mvc:interceptors>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值