springMVC

112 阅读1分钟

@RequestMapping

  • 此注解可以加在类上,相当起个路径的包名。在客户端访问时添加包名/资源名称来访问
  • 此注解可以加在方法上,相当于具体访问的路径。在客户端直接进行资源访问
  • 此注解可以区分get请求post请求,分别进行处理

数据的提交方式

单个数据提交

<h2>数据提交</h2>
<form action="${pageContext.request.contextPath}/one.action" method="post">
    用户名:<input name="uname"><br>
    年龄:<input name="age">
    <input type="submit" value="submit">
</form>
@RequestMapping("/one")
public String test01(String uname,int age){
    System.out.println("uname = " + uname +" age = "+age);
    return "main";
}

对象封装数据提交

<h2>对象的封装提交</h2>
<form action="${pageContext.request.contextPath}/two.action" method="post">
    用户名:<input name="name"><br>
    年龄:<input name="age">
    <input type="submit" value="submit">
</form><br>
@RequestMapping("/two")
public String test02(User user){
    System.out.println("username = "+user.getName()+" age = "+user.getAge());
    return "main";
}

动态占位符(仅限于超链接)

@PathVariable:解析请求参数的名称给方法的形参 提交数据时使用/值的方式,在接收数据时以/{参数名}来指定请求参数的名称,使用@PathValible注解解析请求提交来的数据

<a href="${pageContext.request.contextPath}/three/zs/88.action">动态占位符</a>
/**
 * @PathVariabl 的值要跟 @RequestMapping上的值一致
 * @param name
 * @param age
 * @return
 */
@RequestMapping("/three/{name}/{age}")
public String test03(@PathVariable String name, @PathVariable  String age){
    System.out.println("name = " + name +" age = "+age);
    return "main";
}

请求参数的名称与形参名称不一致

@RequestParam:此注解就是为了完成统一名称的映射

<h2>请求参数的名字与形参不一致</h2>
<form action="${pageContext.request.contextPath}/four.action" method="post">
    用户名:<input name="uname"><br>
    年龄:<input name="uage">
    <input type="submit" value="submit">
</form><br>
@RequestMapping("/four")
public String test04(@RequestParam("uname") String name, @RequestParam("uage")  String age){
    System.out.println("name = " + name +" age = "+age);
    return "main";
}

手工获取参数

<h2>手工获取数据</h2>
<form action="${pageContext.request.contextPath}/five.action" method="post">
    用户名:<input name="uname"><br>
    年龄:<input name="uage">
    <input type="submit" value="submit">
</form><br>
@RequestMapping("/five")
public String test05(HttpServletRequest request){
    String uname = request.getParameter("uname");
    int uage = Integer.parseInt(request.getParameter("uage"));
    System.out.println("name = " + uname +" age = "+uage);
    return "main";
}

解决post请求中文乱码问题

在web.xml文件添加

<filter>
    <filter-name>encode</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>
    <init-param>
        <param-name>forceRequestEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>forceResponseEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encode</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

ajax访问

添加注解驱动

<!--    添加注解驱动-->
    <mvc:annotation-driven></mvc:annotation-driven>

添加驱动

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.12.6.1</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.12.6</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>2.12.6</version>
</dependency>

在web-app下创建js文件夹 添加jquery包

<script src="js/jquery-3.4.1.js"></script>

页面

<h2>ajax</h2>
<a href="javascript:show()">ajax访问服务器</a>
<div id="mydiv">等待服务器返回list数据</div>
</body>
<script type="text/javascript">
    function show(){
        $.ajax({
            url:"${pageContext.request.contextPath}/list.action",
            type:"get",
            dataType:"json",
            success:function(list){
                var s = "";
                $.each(list,function(index,u){
                    s += u.name+"- - -"+u.age+'<br>';
                });
                //将数据回显
                $("#mydiv").html(s);
            }
        })
    }
</script>

数据处理

@RequestMapping("/list")
@ResponseBody
public Object test06(){
    User u1 = new User("zs",18);
    User u2 = new User("li",19);
    User u3 = new User("ws",10);
    User u4 = new User("zi",17);
    List<User> list = new ArrayList<>();
    list.add(u1);
    list.add(u2);
    list.add(u3);
    list.add(u4);

    return list; //springMVC自动转换为json格式返回
}

转发于重定向

image.png

action方法的默认内置参数

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • Model
  • ModelMap
  • Map

request,session,model,modelMap,map都可以携带数据。 request,model,modelMap,map都可以使用请求作用域,跳转时只能以请求转发的方式跳。如果重定向跳转,则数据丢失

index.jsp

<a href="${pageContext.request.contextPath}/data.action">访问携带数据跳转</a>

dataController

@RequestMapping("/data")
public String data(HttpServletRequest request,
                   HttpServletResponse response,
                   HttpSession session,
                   Model model,
                   ModelMap modelMap,
                   Map map){
    User user = new User("taylor",12);
    request.setAttribute("requestUser",user);
    session.setAttribute("sessionUser",user);
    model.addAttribute("modelUser",user);
    modelMap.addAttribute("modelMapUser",user);
    map.put("mapUser",user);
    return "main";
}

main.jsp

requestUser = ${requestUser}<br>
sessionUser = ${sessionUser}<br>
modelUser = ${modelUser}<br>
modelMapUser = ${modelMapUser}<br>
mapUser = ${mapUser}<br>

日期处理

WEB-INF目录下的资源访问

将动态资源放入web-inf目录下的原因是更安全。不可以直接对外访问。必须通过请求转发来进行访问

拦截器

功能类似于过滤器。在请求被处理之前,在控制器方法结束执行之后,还有全部请求响应结束是添加拦截操作。进行各种业务功能处理。

image.png 1)拦截器应用场景

日志处理,权限处理,性能测试

2)拦截器执行的时机

预处理:在请求到达action前进行处理 后处理:在action方法结束后进行处理 最终处理:请求和响应结束后进行善后处理,关闭资源,销毁对象

3)拦截器实现的方式

A:实现接口(推荐使用),HandlerInterceptor 接口

B:继承父类 HandlerInterceptorAdapter父类

4)HandlerInterptor接口中的方法 preHandle() 、postHandler、afterCompletion()

实现权限验证案列

功能:没有登录不允许访问main.jsp和index.jsp

实现步骤:

  • 添加登录的login.jsp页面
  • 添加showLogin的action,打开登录页面
  • 添加登录判断的action,实现登录功能验证
  • 添加拦截器,进行是否登录过的判断,进行拦截或者放行
  • 在springmvc.xml文件中注册拦截器
  • 测试功能

login.jsp

<body>
    <h2>login page</h2>
    <form action="${pageContext.request.contextPath}/login">
        姓名:<input type="text"  name="name"><br>
        密码:<input type="password" name="password"><br>
        <input type="submit" value="提交">
    </form>
    ${msg}
</body>

login.controller

@RequestMapping("login")
public String login(String name, String password, HttpServletRequest request){
    if(name.equals("zs") && password.equals("123")){
        request.getSession() .setAttribute("user",name);
        return "main";
    }else{
        request.setAttribute("msg","Login Info Error");
        return "login";
    }
}

loginInterceptor

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        /**
         * 判断是否登录过
         * 从session中获取user用户的信息,如果有,则登录过放行,如果没有 则回到登录页面
         */
        if(request.getSession().getAttribute("user") == null){
            request.setAttribute("msg","您还没有登录,请先去登录");
            request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
            return false;
        }
        return true;
    }
}

springmvc

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**/"/>
        <mvc:exclude-mapping path="/login"/>
        <mvc:exclude-mapping path="/showLogin"/>
        <bean class="com.bjpowernode.interceptor.LoginInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

ssm整合

建库建表 image.png