Spring web mvc重点、流程、中文乱码问题、异常、拦截器

Spring web mvc重点

1、Springwebmvc工作流程
a.浏览器发出一个http请求
b.请求首先进入DispatcherServlet主控制器
c.主控制器调用HandlerMapping组件,根据请求找映射的Controller处理
d.执行Controller处理方法,将返回结果给ViewResolver组件
e.ViewResolver组件根据Controller返回结果定位视图JSP,将模型数据传递给JSP
f.由JSP生成响应结果,给浏览器输出

2.Springwebmvc开发过程
a.搭建SpringMVC开发环境
b.流程设计
请求–>DispatcherServlet–>HandlerMapping–>Controller组件(变化)–>ViewResolver–>JSP组件(变化)
c.编写jsp,Controller组件
d.配置处理流程

如何解决中文接收乱码问题

可以用request的编码解码方法在最前面设置。
也可以通过过滤器Filter在中间设置编码就可以了。
request.setCharacterEncoding(“utf-8”)
不要忘了过滤器也还要在web.xml中配置
在Spring-web-*的jar包里提供了一些filter、servlet可以用
CharacterEncodingFilter(Spring-web.jar)

如何去处理异常

有全局的处理和单独的Controller处理
看对应状态码 然后 root case
可以用try catch
向外抛异常,抛给DispatcherServlet(但是要配置异常处理器)
Spring配置文件中配置

<!-- 异常处理器-->
<bane class=”org.springframework.web.servlet.handler.SimpleMappingExceptionResolver”>
<property name=”exceptionMapping”>
<props>
<prop key=”java.lang.Exception(异常类型)”>视图页面名称</prop>
</props>
</property>
</bean>

这里写图片描述

例子:简单年龄计算

Controller (加入异常处理)

package Controller;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class AgeController {
    //进入age.jsp
    @RequestMapping("/toage.do")
    public String toagecontraller(){

    return "age";
    }
    @RequestMapping("/age.do")
    public String agecontroller(String birth, ModelMap model) throws Exception{
        //接收用户输入的生日,计算年龄
        Date now = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date birth1 = (Date) sdf.parse(birth);
        int age = now.getYear()-birth1.getYear();
        model.put("msg", "你的年龄"+age);
        return "age";
    }

    //当前Controller异常处理。写在哪个Controller就在哪个有效
    //出现异常,优先找当前Controller的异常处理方法。没有才回去容器找全局异常处理方法
    @ExceptionHandler//局部异常处理手段
    public String handleException(HttpServletRequest request,Exception e){

        request.setAttribute("msg", "输入格式有误!");

        return "age";

    }
    }

age.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>age</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>

  <body>
  <form action="age.do"method="post">
   <h1>年龄计算器</h1>
请输入你的生日:<input type ="text" name="birth" >
<input type="submit" value="开始计算">

</form>

${msg}

  </body>
</html>

这里写图片描述

这里写图片描述

如何实现登陆权限检查

使用session进行约定值的判断
实现方法:1.采用Filter;****2.采用拦截器(SpringMVC)
a.拦截器组件简介
是SpringMVC特有组件。
拦截器可以在Controller之前拦截;
也可以在Controller之后拦截;
还可以在JSP解析完毕输出之前拦截

这里写图片描述

写一个登陆后才能看到年龄计算器

用拦截器控制 session中是否有值。有则可以进入。没有则重定向到登陆界面。

登陆控制

package Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller//扫描到Spring容器
public class toLogonController  {
    @RequestMapping("tologin.do")
    public ModelAndView execute(){
        ModelAndView mav = new ModelAndView("login");

        return mav;

    }

    @RequestMapping("login.do") 
public String checkLogin(HttpServletRequest request){
         String username=request.getParameter("username");
         String password=request.getParameter("password");
         if(username.equals("root")&&password.equals("1234")){
             HttpSession session = request.getSession();
             session.setAttribute("username", username);
             session.setMaxInactiveInterval(30);
             return "age";
         }else

    return "login";
}

}

拦截器:

package Interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class LoginInterceptor implements HandlerInterceptor{

    //请求处理完毕,输出之前
    public void afterCompletion(HttpServletRequest arg0,
            HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {


    }
        //Controller之后
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
            Object arg2, ModelAndView arg3) throws Exception {


    }
        //Controller之前
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
            Object arg2) throws Exception {

        //增加登陆检查
        //获取登陆成功后放置的用户信息
        HttpSession session = arg0.getSession();
        String name = (String)session.getAttribute("username");
        if(name!=null){//登陆过
            return true;
        }else{//未登陆或登录失败
            arg1.sendRedirect("tologin.do");
            return false;
        }


    }

}

配置:

    <!-- 配置拦截器 -->
    <mvc:interceptors>
    <mvc:interceptor>
        <!-- 所有的都拦截就这么写 -->
    <mvc:mapping path="/**"/>
<!-- 放过哪些请求 -->
    <mvc:exclude-mapping path="/tologin.do"/>
    <mvc:exclude-mapping path="/login.do"/>
    <bean class="Interceptor.LoginInterceptor"></bean>
    </mvc:interceptor>
    </mvc:interceptors>

没有登陆过直接去访问 toage.do 就会跳转到登陆界面

这里写图片描述

登陆成功后才可以看到年龄计算器

这里写图片描述

这里写图片描述

我设置了最大时间 30后session就会失效。
遇到的最大的问题就是拦截,拦截哪些。还有就是逻辑问题。

拦截器适合共通逻辑。也是SpringMVC特有的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值