springMVC(2、过滤静态资源文件&中文乱码处理&Ajax返回JSON)

springMVC(2、过滤静态资源文件&中文乱码处理&Ajax返回JSON)

一.过滤静态资源文件

	<servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
        <!--所有请求都会进入到DispatcherServlet中,不想进入的使用静态资源过滤器-->
    </servlet-mapping>

当 DispatcherServlet 的 url 配置为"/"时,所有的请求都会进入DispatcherServlet 中,如.html,.jpg,.js带有后缀名的文件都访问不到,spring提供了<mvc:default-servlet-handler>来解决这个问题

在springMVC配置文件中配置 <mvc:default-servlet-handler>后,Spring MVC 上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会像一个检查员,对进入 DispatcherServlet 的 URL 进行筛查,如果发现是静态资源的请求,就将该请求转由 Web 应用服务器默认的 Servlet 处理,如果不是静态资源的请求,才由 DispatcherServlet 继续处理。

	<!--过滤静态资源文件  以.html,.js,.css为后缀的地址不会进入DispatcherServlet-->
    <mvc:default-servlet-handler></mvc:default-servlet-handler>

二.中文乱码处理

​ 提交请求时,如果输入中文,处理器获取到后可能乱码,在学习servlet时使用过滤器,将有接收请求的servlet添加到一个按指定字符集编码的过滤器中,springMVC中提供了一个过滤器,直接使用即可

在web.xml中配置

	<!--中文乱码处理~~过滤器-->
    <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

在servlet中,我们使用流向前端发送数据,用谷歌的Gson将java实体类转为json格式给前端发送

		PrintWriter out = null;
        //设置响应内容的编码格式
        resp.setContentType("text/html;charset=utf-8");
        if(mark.equals("list")){
            try {
                out = resp.getWriter();
                List<Student> studentList = StudentDao.studentListInfo();
                //集合转为json字符串 "[{id:1,sno:1001},{...},...]"
                out.println(new Gson().toJson(studentList));//返回给前端一个Json字符串
            } catch (Exception e) {
                e.printStackTrace();
                out.println(500);
       		}

springMVC中提供了注解标签@ResponseBody

  • @ResponseBody
    • Controller的方法返回的对象通过某个转换器转化为指定的格式,写入到到response 对象的 body 区,通常用来向处理异步请求,返回 JSON 数据
    • 注意:在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,效果等同于通过 response 对象输出指定格式的数据

使用@ResponseBody注解标签还须添加一个jackson的jar包

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

使用一个登陆示例

LoginMapper

package com.ffyc.ssm.dao;

import com.ffyc.ssm.model.Admin;
import org.springframework.stereotype.Repository;

@Repository//持久层注解标签
public interface LoginMapper {

    Admin login(Admin admin);
}

mybatis配置中定义别名,这样定义一次,以后直接使用model中的类即可

	<!--为modle包下所有类定义别名-->
	<typeAliases>
        <package name="com.ffyc.ssm.model"/>
    </typeAliases>

最初我们一个一个定义:

	<!--为类定义别名-->
    <typeAliases>
        <typeAlias type="com.ffyc.mybatisdemo.model.Admin" alias="Admin"></typeAlias>
        <typeAlias type="com.ffyc.mybatisdemo.model.Dept" alias="Dept"></typeAlias>
        <typeAlias type="com.ffyc.mybatisdemo.model.Employee" alias="Employee">	</typeAlias>
    </typeAliases>

LoginMapper接口的xml实现

	<select id="login" parameterType="Admin" resultType="Admin">
        select * from admin where account=#{account} and password=#{password}
    </select>

LoginService

package com.ffyc.ssm.service;

import com.ffyc.ssm.dao.AdminMapper;
import com.ffyc.ssm.dao.LoginMapper;
import com.ffyc.ssm.model.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service//服务层注解
public class LoginService {

    @Autowired//自动注入
    private LoginMapper mapper;

    @Transactional//事务管理
    public Admin login(Admin admin){
        return mapper.login(admin);
    }
}

LoginController

package com.ffyc.ssm.controller;

import com.ffyc.ssm.common.CommonResult;
import com.ffyc.ssm.model.Admin;
import com.ffyc.ssm.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;

@Controller
@RequestMapping(path = "/login")
public class LoginController {

    @Autowired
    LoginService service;

    /*
       向ajax请求响应数据,
       springmvc添加@ResponseBody后,将return的对象直接转为json(添加jar包)
       后端向前端响应数据时,统一数据格式,封装CommonResult类,封装响应结果 code msg data
     */
    @ResponseBody
    @PostMapping(path = "/login")
    public CommonResult login(Admin admin, HttpSession session){
        CommonResult result = null;
        try{
            Admin admin1 = service.login(admin);
            if(admin1!=null){
                session.setAttribute("admin", admin1);
                result  = new CommonResult<Admin>(200,"登录成功",admin1);
            }else {
                result  = new CommonResult<Admin>(201,"账号/密码错误",admin1);
            }
        }catch (Exception e){
            e.printStackTrace();
            result = new CommonResult<Admin>(500, "登录失败", null);
        }
        return result;
    }
}

前端请求

		function login(){
            $.post("login/login",$("#loginForm").serialize(),function (res){
                if(res.code==200){
                    alert(res.msg);
                    //存储用户账号信息
                    window.sessionStorage.setItem("account",res.data.account);
                    //存储用户上传文件的新文件名
                    window.sessionStorage.setItem("newFileName",res.data.newFileName);
                    location.replace("success.html");
                }else if(res.code==201||500){
                    alert(res.msg);
                    return;
                }
            },"json")
        }	style="zoom:50%;"

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值