javaee之SpringMVC2

news2024/11/19 15:17:58

SpringMVC返回值类型以及响应数据类型

1.搭建环境

还是按照springMVC1中的搭建环境进行搭建。这里就不多说。

响应之返回值是String类型

我们先来创建一个User类

User,java

package com.pxx.domain;

import java.io.Serializable;

public class User implements Serializable {

    private String username;
    private String password;
    private Integer age;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

下面写一个response.jsp

 然后去写一个Controller类

 然后我们现在去把返回给我们的东西,传给视图层,这里涉及到一个页面

 

响应之返回值是void类型

 

 

响应之返回值是ModelAndView 

响应之使用forward和redirect进行页面跳转 

 

 响应json数据之过滤静态资源

利用ResponseBody注解响应json数据

上面做了一个给了俺就一个点击事件

 

 但是你会发现点击按钮没有反应

我们必须去SpringMVC里面配置一下前端控制器,也就是表明那些资源不拦截

 

 

我们传一个ajax的请求过去

 上面的ajax就是我们传送过去的是一个json数据,然后变成java对象封装,然后再把java对象变成json数据格式返回。那么这里就需要一个jar包来进行两者之间的转换jackson,我们直接在pom.xml导入响应的jar包就行

 文件上传

 文件上传原理

 首先我们需要依赖两个包

这个 是apache给我们提供的两个jar包,导入坐标才能用下面的类与方法 

 传给服务端的是一个分段信息流

 下面说一下常见函数与类

 第一步我们先把包导一下

 先去index.jsp里面写一个前端页面

 再去controller层写一下服务器代码

/**
     * 文件上传
     */
    @RequestMapping("/fileupload1")
    public String fileupload1(HttpServletRequest request) throws Exception {
        System.out.println("文件上传");
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        File file = new File(path);
        if(!file.exists()) {
            file.mkdirs();
        }

        //解析request对象,获取上传文件项
        // 解析request对象,获取上传文件项
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 解析request
        List<FileItem> items = upload.parseRequest(request);
        // 遍历
        for(FileItem item:items){
            // 进行判断,当前item对象是否是上传文件项
            if(item.isFormField()){
                // 说明普通表单向
            }else{
                // 说明上传文件项
                // 获取上传文件的名称
                String filename = item.getName();
                // 把文件的名称设置唯一值,uuid
                String uuid = UUID.randomUUID().toString().replace("-", "");
                filename = uuid+"_"+filename;
                // 完成文件上传
                item.write(new File(path,filename));
                // 删除临时文件
                item.delete();
            }
        }
        return "success";
    }

 

 SpringMVC文件上传方式原理分析

 

 先去springmvc.xml配置一个文件解析器

 然后去index.jsp添加一个springMVC相关的上传代码

 

文件上传之跨服务器上传分析

 

那么这里模拟一下,创建两台Tomcat服务器

上面就是不管怎么说,文件会先传到应用服务器上,然后应用服务器再把图片传给图片服务器,这个怎么传就是一个问题,这里就要用到sun公司给我们提供的一个jar包,jersey-core-1.18.1.jar这样一个jar包

再来创建一台服务器

 这里注意端口号

 

 然后再来创建一个模块

这里还是来选择没有父工程

在新服务器里面创建一个uploads包,等会把图片放到这个服务器里面

现在去把项目部署到服务器上

 

 

 

Tomcat是可以启动两台服务器的

关的时候也可以选择性关闭

 好了服务器基本上就配好了

下面进行代码编写

现在pom.xml导入jar包的坐标

因为我们需要一个sun公司的jar包来给我们进行跨服务器传送

 

 先来index.jsp前端编写一下上传框

 上面在做文件传输之前,我们必须允许接收文件的目标服务器可以支持写入操作

直接去tomcat里面的

 说一下我把上面的项目进行了重构,重新构建了一个空的工程,然后里面放了两个模块,其他和上面一样,都没变

 说一下在进行服务器文件传输过程中会遇到的问题

第一个:

 出现连接

拒绝的情况,这个时候需要去检查你的图片服务器到底有没有打开,或者你的服务器访问路径有没有出问题,就是如下地址别写错了

 

 第二个出现404错误

直接报了一个404错误,这个时候还是路径的问题

第三个

 这里403

主要是服务器拒绝读写,去服务器的tomcat配置一下

conf->web.xml中进行配置

 下面上一下服务器端的所有代码

UserController.java

package com.pxx.controller;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;
import java.util.UUID;

@Controller
@RequestMapping("/user")
public class UserController {

    /**
     * 跨服务器文件上传
     * @return
     */
    @RequestMapping("/fileupload3")
    public String fileuoload3(MultipartFile upload) throws Exception {
        System.out.println("跨服务器文件上传...");

        // 定义上传文件服务器路径
        String path = "http://localhost:9090/fileuploadserver/uploads/";

        // 说明上传文件项
        // 获取上传文件的名称
        String filename = upload.getOriginalFilename();
        // 把文件的名称设置唯一值,uuid
        String uuid = UUID.randomUUID().toString().replace("-", "");
        filename = uuid+"_"+filename;

        // 创建客户端的对象
        Client client = Client.create();

        // 和图片服务器进行连接
        WebResource webResource = client.resource(path + filename);

        // 上传文件
        webResource.put(upload.getBytes());

        return "success";
    }

    /**
     * SpringMVC文件上传
     * @return
     */
    @RequestMapping("/fileupload2")
    public String fileuoload2(HttpServletRequest request, MultipartFile upload) throws Exception {
        System.out.println("springmvc文件上传...");

        // 使用fileupload组件完成文件上传
        // 上传的位置
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        // 判断,该路径是否存在
        File file = new File(path);
        if(!file.exists()){
            // 创建该文件夹
            file.mkdirs();
        }

        // 说明上传文件项
        // 获取上传文件的名称
        String filename = upload.getOriginalFilename();
        // 把文件的名称设置唯一值,uuid
        String uuid = UUID.randomUUID().toString().replace("-", "");
        filename = uuid+"_"+filename;
        // 完成文件上传
        upload.transferTo(new File(path,filename));

        return "success";
    }

    /**
     * 文件上传
     * @return
     */
    @RequestMapping("/fileupload1")
    public String fileuoload1(HttpServletRequest request) throws Exception {
        System.out.println("文件上传...");

        // 使用fileupload组件完成文件上传
        // 上传的位置
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        // 判断,该路径是否存在
        File file = new File(path);
        if(!file.exists()){
            // 创建该文件夹
            file.mkdirs();
        }

        // 解析request对象,获取上传文件项
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 解析request
        List<FileItem> items = upload.parseRequest(request);
        // 遍历
        for(FileItem item:items){
            // 进行判断,当前item对象是否是上传文件项
            if(item.isFormField()){
                // 说明普通表单向
            }else{
                // 说明上传文件项
                // 获取上传文件的名称
                String filename = item.getName();
                // 把文件的名称设置唯一值,uuid
                String uuid = UUID.randomUUID().toString().replace("-", "");
                filename = uuid+"_"+filename;
                // 完成文件上传
                item.write(new File(path,filename));
                // 删除临时文件
                item.delete();
            }
        }

        return "success";
    }

}

 

文件上传 的所有原代码springMVC里面

异常处理及拦截器

异常处理程序展示与分析 

 先来看一个异常处理原理

这里想说的是啥,就接是控制器拿到了异常,如果直交给浏览器呢,会出现什么情况?

客户端一访问,就会直接给我们出现如下页面 

 

 

换句话说,也就是把后端传过来的异常交给 一个我们自定义的异常处理类来处理,这个类必须去实现HandlerExceptionResolver这个接口,然后去springmvc.xml进行配置一下

先来写一个定义异常类,用于接收异常信息

SysException.java

然后我们去写控制器页面,然后抛出了一个我们自定义的异常

 

 下面我们要写自定义异常处理类

SysExceptionResolver.java

public class SysExceptionResolver  implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception ex) {
        //获取异常对象
        SysException e = null;
        if(ex instanceof SysException) {
            e = (SysException)ex;//如果是我们的自定义异常直接转换一下就好了
        } else {
            e = new SysException("系统正在维护");
        }
        //创建modelAndview对象
        ModelAndView mv = new ModelAndView();
        //把数据添加到request域里面
        mv.addObject("errorMsg",e.getMessage());
        mv.setViewName("error");//需要跳转到的前端页面
        return mv;
    }

上面做好了之后,我们就要去做一个error这个页面,相当于是跳转页面

这个页面就是视图解析器给我们跳转的页面

 

在springmvc.xml里面配置一下异常处理器

现在我们去做一下前端页面

SpringMVC拦截器 

 index.jsp

下面编写controller包下面的UserController文件

 看一下基本运行情况

 下面说一下拦截器的原理

 

 

追到这个接口里面

 

 

 

 

 MyInterceptor1.java

package com.pxx.controller.com.pxx.interceptor;

import com.sun.scenario.effect.impl.sw.java.JSWBlend_SRC_OUTPeer;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

/***
 * 自定义拦截器
 */
class MyInterceptor1 implements HandlerInterceptor {
    /**
     * return true放行,执行下一个拦截器,如果没有,执行controller中的方法
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor1执行了。。。。。。");
        return true;
    }

    /**
     * controller中的方法执行后执行
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor执行了。。。。");
    }
}

我们现在要去看一下拦截器的执行顺序,这里我们先去改一下success.jsp的代码,让它输出的内容在控制台进行展示

然后不要忘了去springmvc.xml里面进行配置 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/135571.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PS 矩形选区工具(1)基本用法 生成图层 选区方式演示讲解

我们先打开PS 然后打开一个项目 我们可以选择一个图层 然后 点击左上角 图像>调整>色相.饱和度 弹出操作框之后 我们拉动色相的色条 对应视图就会发生主体颜色的变化 然后 我们打开一个只有一个图层的图片项目 我们对这个图层操作 整个都会变化 但如果我只是想改其中…

后悔升级iPhone?教你如何把iOS15降回iOS14

还在使用betabeta版iOS 15和iPadOS 15吗&#xff1f;如果你出于某种原因准备返回稳定的iOS 14&#xff0c;本篇文章将会为你详细介绍如何从 iOS 15 beta版降级到 iOS 14&#xff0c;这对于有一定动手能力的人来说并不难。 如何从 iOS 15 beta版降级到 iOS 14 重要提示&#xf…

Spring是怎么回事?新手入门就看这篇吧

前言 今天壹哥给大家介绍一套开源的轻量级框架&#xff0c;它就是Spring。在给大家详细讲解Spring框架之前&#xff0c;壹哥先给大家介绍Spring框架的主要内容&#xff1a; Spring的基本概念 Spring核心思想之ioc Spring核心思想之aop Spring框架对事务的支持 在本系列文章…

解决前端如何使用插件crypto-js进行AES加密方式数据加密

一、问题 目录 一、问题 1.1 问题概述 1.2 操作过程描述 二、解决 2.1 说明 2.2 crypto-js安装 2.3 使用crypto-js 1.1 问题概述 如何进行加密和解密以及采用什么方式进行加密解密是本文主要解决的内容~ 之前有小伙伴问了关于加密解密的事&#xff0c;确实是的&#xff…

pdfbox / XSL + FOP 转换 PDF文档

XSL-FO是XSL Formatting Objects的缩写&#xff0c;它是一种用于文档格式的XML 置标语言。XSL-FO是XSL的一部分&#xff0c;而XSL是一组定义XML数据转换与格式的W3C技术。XSL的其他部分有XSLT与XPath。 XSL-FO是用于格式化XML数据的语言&#xff0c;全称为Extensible Styleshe…

python基础讲解 02

人工智能学习基础四剑客&#xff08;库&#xff09;Numpy ( Numerical Python)使用创建随机数组查看数组的属性数组与标量之间的计算四剑客&#xff08;库&#xff09; Python被大量应用在数据挖掘和深度学习领域,其中使用极其广泛的是Numpy&#xff08;N维数组对象和向量运算&…

Nessus学习

攻击主机&#xff1a; Kali 192.168.11.106靶机&#xff1a;windows server 2008 r2 192.168.11.134 x64 32位nessus实验原理&#xff1a;利用漏洞扫描器能够自动应用漏洞扫描原理&#xff0c;对目标主机安全漏洞进行检测&#xff0c;附带识别主机漏洞的特征库的功能&#xf…

使用客户端证书登录MySQL

使用客户端证书登录MySQL登录MySQL具有安全性高、不用输入密码的优点&#xff0c;这里说明生成证书和登录的过程。 实验环境是Linux上的的MySQL 8.0.31社区版。 生成证书 使用openssl req创建X.509证书&#xff0c;下面的命令创建有效期10年的私钥&#xff0c;使用man req可…

Kali Linux中shutdown指令的用法3-3

3 TIME介绍 TIME是shutdown指令的第二个参数&#xff0c;用来表示实现关机计划的时间&#xff0c;如果不指定TIME&#xff0c;则默认是1分钟之后实现关机计划。 3.1 通过hh:mm格式指定时间 可以通过hh:mm格式指定关机的具体时间&#xff0c;其中hh表示小时&#xff0c;mm表示…

CredSSP加密数据库修正

新部署的机器&#xff0c;远程登录时&#xff0c;提示如下&#xff1a; 原因是注册表里面缺少东西&#xff0c;新建一个文本文件&#xff0c;复制如下内容保存&#xff0c;然后将保存的文本文件保存为后缀为reg的可执行文件 Windows Registry Editor Version 5.00[HKEY_LOCAL_…

【Django项目开发】权限相关的模型设计(五)

文章目录一、什么是权限二、RBAC模型三、权限模型类设计1、需要设计那些字段2、特别注意四、角色模型类设计1、需要定义的字段有2、 多对多模型类设计(重点)五、用户模型类设计(前面已经设计好了)六、菜单模型类设计(前面已经设计好了)七、总结:上面4个表的关联关系为:如下八、…

Spring注解详解(使用注解的方式完成IOC)

补充&#xff1a;xml配置 最开始(Spring 1.x)&#xff0c;Spring都是通过xml配置控制层(controller)--业务逻辑层(service)--dao层--数据源的关系&#xff0c;但是比较复杂 Spring 2.x的时候&#xff0c;随着JDK1.5支持注解的方式&#xff0c;实现了 "xml 注解" 的开…

Vue自定义指令,自定义插件,过滤器,混入,nextTick

自定义指令&#xff1a;自己定义类似指令的技术。V-开关的特殊属性&#xff0c;是一个对象&#xff0c;自己定义其作用。 指令: v-特殊属性 * vue内置指令: v-html v-text v-pre * v-bind v-on v-if v-show v-for …

我的前端学习经历

我最近在开发一个NFT相关的Saas&#xff0c;部分截图如下&#xff1a;这是我一段时间前&#xff0c;朋友圈发的图&#xff0c;现在Saas在页面上有点变化&#xff0c;但懒得再截图了。客观而言&#xff0c;布局还可以&#xff0c;这一套的技术栈是&#xff1a;React TailwindCs…

​无线数据终端DTU的电路防护元器件推荐产品型号

​无线数据终端DTU是专门用于将串行数据转换为IP数据或将IP数据转换为串行数据通过无线通信网络传输的无线终端设备&#xff0c;因此对于它来说ESD静电放电及雷击浪涌的防护显得尤其重要。 DTU已广泛应用于电力、环保、LED信息发布、物流、水文、气象等行业&#xff0c;其硬件…

【人工智能原理自学】方差代价函数:知错

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;笔记来自B站UP主Ele实验室的《小白也能听懂的人工智能原理》。 &#x1f514;本文讲解一元一次函数感知器&#xff1a;如何描述直觉&#xff0c;一起卷起来叭&#xff01; 目录…

[oeasy]python0037_字符画艺术_asciiview_自制小动物_imagick_asciiart

牛说(cowsay) 回忆上次内容 我们狂飙了一路 从用shell 直接执行 python程序到用shell 循环执行 python程序 循环体中 把 python的 输出结果 用管道 交给了 figlet 把 figlet的 输出结果 用管道 交给了 cowsay 把 cowsay的 输出结果 用管道 交给了 lolcat 最后 提权 直接运行 s…

课程设计 | 学生成绩管理系统

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

减小 Go 代码编译后的二进制体积

1 基线用例 减小编译后的二进制的体积&#xff0c;能够加快程序的发布和安装过程。接下来呢&#xff0c;我们分别从编译选项和第三方压缩工具两方面来介绍如何有效地减小 Go 语言编译后的体积。 我们采用同一个测试工程来测试不同方式的效果。 使用的测试工程如下&#xff0…

SQL全自动化检查神器

介绍 Yearning MYSQL 是一个SQL语句审核平台。提供查询审计&#xff0c;SQL审核等多种功能&#xff0c;支持Mysql&#xff0c;可以在一定程度上解决运维与开发之间的那一环&#xff0c;功能丰富&#xff0c;代码开源&#xff0c;安装部署容易&#xff01; 功能介绍 SQL查询查询…