SpringMVC(3)RESTFful案例&&处理Ajax请求
restful测试案例
springmvc处理Ajax请求
使用springmvc注解 接收or返回 JSON格式数据
8、RESTful测试案例
1、准备工作
和传统 CRUD 一样,实现对员工信息的增删改查。
为了方便,没有链接数据库,使用DAO中的文本数据。
2、配置文件
web.xml
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"><!-- 设置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> <init-param> <param-name>forceE ...
剑指offer 26~36
26~36
26. 树的子结构
难度中等603
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
image-20220801202035503
isSubStructure(A, B) ,
有三种情况
以A为根节点的子树包含B (A, B 子结构部分以A开始 => A是根节点) isSame()方法
B是A的左子树的子结构 重新isSubStructure(A.left,B)
B是A的右子树的子结构 重新isSubStructure(A.right,B)
123456789101112131415161718192021/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public boolean isSubStructure(TreeNode A, TreeNode B) { return (A != null && B != null) && (isSame(A, B)|| isSubStructure(A.left, B) || isSubStructure(A.right, B)); } public boolean isSame(TreeNode A,TreeNode B) { // 等于也不能返回true , 还有子节点,因此要返回 子判断节点是否相同的表达式 if (B == null) return true; if (A == null||A.val!=B.val) return false; return isSame(A.left,B.left)&&isSame(A.right,B.right); }}
27. 二叉树的镜像
难度简单287
请完成一个函数,输入一个二叉树 ...
剑指offer 14~25
14~25
14- I. 剪绳子
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
1、数学方法
本题用到的结论:
① 当所有绳段长度相等时,乘积最大。② 最优的绳段长度为 33 。
证明如下:
均值不等式image-20220801224312141当且仅当n1=n2=n3=…=n n时成立
设将绳子按照 xx 长度等分为 aa 段,即 n = a x n=ax ,则乘积为 xa
观察以下公式,由于 nn 为常数,因此当image-20220801224447089取最大值时, 乘积达到最大值。
可将问题转化为求 y = x1/x 的极大值,因此对 x求导数。
image-20220801224401429
分别代入2, 3 y(2) =1.41 ,y(3)=1.44; 或者image-20220801224424098)
由此可得,尽可能将绳子以长度 3 等分为多段时,乘积最大。
image-20220801224417533
123456789class Solution { public int cuttingRope(int n) { if(n<=3) return n-1; double b=n/3; if(n%3==0) return (int)Math.pow(3.0,b); else if(n%3==1) return ((int)Math.pow(3.0,b-1)*4); return ((int)Math.pow(3.0,b)*2); }}
2、动态规划
123456789101112class Solution { public int cuttingRope(int n) { int[] dp = new int[n + 1]; Arrays.fill(dp, 1); for (int i = 3; i <= n; ...
剑指offer 37~47
37~47
38. 字符串的排列
难度中等588
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
回溯算法:
1234567891011121314151617181920212223242526272829303132333435class Solution { char[]chars; boolean[]vis=new boolean[128]; List<String> list=new ArrayList<>(); public String[] permutation(String s) { chars=s.toCharArray(); dfs(0); return list.toArray(new String[list.size()]);// 预设数组大小 } //循环 , 每次交换 下标, void dfs(int idx){ // idx 表示的是当前的下标 if(idx==chars.length-1){// 此时已经遍历完了一种情况 list.add(String.valueOf(chars)); return ; } //Arrays.fill(vis,false); Set<Character> set=new HashSet<>(); for(int i=idx;i<chars.length;i++){ // i直接从idx 的位置开始, 因为前面的字符已经确定了 //if(vis[chars[i]]){ if(set.contains(chars[i])){ continue; // 有重复字符, 跳过本轮循环 } set.add(chars[i]); swap(chars,i,idx); // 交换 , 出现新的情况 // vis[chars[i]]=true; ...
剑指offer 48~58
48~58
48. 最长不含重复字符的子字符串
难度中等476
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
滑动窗口:
通过map记录下标, 如果遇到了相同字符, 就把左下标换成 前面的那个字符+1
需要注意的是, map会存储所有出现的字符, 也就是说前面的那个相同的字符(有可能不在窗口的范围),
这个字符的位置+1有可能是小于pre的, 这样就会导致 pre 偏大
因此需要 pre=Math.max(pre,map.get(chars[i])+1);
1234567891011121314151617class Solution { public int lengthOfLongestSubstring(String s) { int pre=0,res=0; if(s.length()==0)return res; Map<Character,Integer> map=new HashMap<>(); char[]chars=s.toCharArray(); for (int i = 0; i < chars.length; i++) { //abcb if(map.containsKey(chars[i])){ pre=Math.max(map.get(chars[i])+1,pre); } map.put(chars[i],i); res=Math.max(res,i+1-pre); } return res; }}
49. 丑数
难度中等367
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
丑数的递推性质: 丑数只包含因子 2, 3, 5,因此有 “丑数 == 某较小丑数× 某因子”
例如:10 = 5 X 2。
我们可以通过 1 , 然后乘以不同的因子(2 3 5) 来得到所有的丑数 ,
" 只包含质因子 2、3 和 5 的数称作丑数 "
根据 ...
剑指offer 3~13
3~13
03. 数组中重复的数字
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
通过交换使得每一个数字回到与他自己的位置(最多两次),然后判断是否与相应下标的数字相同即可
12345678910111213141516171819class Solution { public static void swap(int[]arr,int i,int j) { int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } public int findRepeatNumber(int[] nums) { for(int i=0;i<nums.length;i++){ while(nums[i]!=i){ if(nums[i]==nums[nums[i]]) { return nums[i]; } swap(nums,i,nums[i]); } } return -1; }}
或者是直接通过Set或者Map
1234567891011121314151617181920212223class Solution { public int findRepeatNumber(int[] nums) { Set<Integer> set=new HashSet<>(); for(int a:nums) { if(!set.add(a)) return a; } return -1; }}class Solution { public int findRepeatNumber(int[] nums) { Map< ...
剑指offer 59~69
59~69 on building…
59 - I. 滑动窗口的最大值
难度困难474
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
暴力解法
123456789101112131415class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(nums.length==0||k==0) return new int[0]; // 数组为null 的情况 int []res=new int[nums.length-k+1]; // 滑动窗口的数量 int pre=0; // 滑动窗口左下标 while(pre+k<=nums.length){ int max=nums[pre]; // 窗口最左边的元素 for (int i = pre+1; i < pre+k; i++) {// 循环窗口 max=Math.max(max,nums[i]); } res[pre++]=max;// 移动窗口并赋值 } return res; }}
单调队列
59 - II. 队列的最大值
难度中等403
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
若队列为空,pop_front 和 max_value 需要返回 -1
对于入队操作以及出队操作, 直接使用Queue 的API即可
对于MAX_VALUE,如果要实现O(1)的复杂度, 需要使用Deque
使用辅助队列Deque , 用来储存最大值
1234567891011121314151617181920212223242526272829303132333435class MaxQueue { Deque<Integer> deque=new LinkedList<>(); // 辅助队列, 储存最大值 Queue ...
SpringMVC(2)域对象共享数据&&视图&&restful
域对象共享数据
springmvc视图
RESTFful简介
5、域对象共享数据
request
session
application
5.1、使用ServletAPI向request域对象共享数据
12345@RequestMapping("/testServletAPI")public String testServletAPI(HttpServletRequest request){ request.setAttribute("testScope", "hello,servletAPI"); return "success";}
5.2、使用ModelAndView向request域对象共享数据
通过ModelAndView向请求域对象共享数据
官方推荐
如果要使用ModelAndView ,方法的返回值必须是 ModelAndView
使用model功能向请求域共享数据
使用view功能设计逻辑视图,但是控制器方法的返回值必须是ModelAndView
前端超链接
1<a th:href="@{/test/mav}" >测试通过ModelAndView向请求域共享数据</a>
后端控制器
1234567891011121314@RequestMapping("/test/mav")public ModelAndView testMAV(){ /** * ModelAndView包含 model 和view 的功能, * model:向请求域中共享数据 * view:创建逻辑视图实现页面跳转 */ ModelAndView modelAndView=new ModelAndView(); // 向请求域中共享数据 modelAndView.addObject("testRequestScope","helloMAV"); //设置逻辑视图 modelAndView.setViewName("success"); return modelAndView;}
视图页面
1<p th:text="${testRequestScope}"/>
5.3、使用Model向reque ...
SpringMVC(1)环境搭建&&@RequestMapping注解&&springmvc获取请求参数
环境配置
@RequestMapping注解
获取请求参数的方法
1、SpringMVC简介
1.1、什么是MVC
MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分
M:Model,模型层,指工程中的JavaBean,作用是处理数据
JavaBean分为两类:
一类称为实体类Bean:专门存储业务数据的,如 Student、User 等
一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理业务逻辑和数据访问。
V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据
C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器
MVC的工作流程:用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,处理完毕将结果返回到Controller,Controller再根据请求处理的结果找到相应的View视图,渲染数据后最终响应给浏览器
1.2、什么是SpringMVC
SpringMVC是Spring的一个后续产品,是Spring的一个子项目
SpringMVC 是 Spring 为表述层开发提供的一整套完备的解决方案。在表述层框架历经 Strust、WebWork、Strust2 等诸多产品的历代更迭之后,目前业界普遍选择了 SpringMVC 作为 Java EE 项目表述层开发的首选方案。
注:三层架构分为表述层(或表示层)、业务逻辑层、数据访问层,表述层表示前台页面和后台
servlet
1.3、SpringMVC的特点
Spring 家族原生产品,与 IOC 容器等基础设施无缝对接
基于原生的Servlet,通过了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一处理
表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案
代码清新简洁,大幅度提升开发效率
内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可
性能卓著,尤其适合现代大型、超大型互联网项目要求
2、入门案例
2.1、开发环境
IDE:idea 2021.3
构建工具:maven3.8.4
服务器:tomcat 9.0
Spring版本:5.3.1
2.2、创建ma ...
链表
18.删除链表的节点
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
定义一个next 为 head 的指针, 用来过 需要删除的节点是第一个节点的情况, 对于别的位置,直接遍历即可
123456789101112131415161718192021222324252627282930/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode deleteNode(ListNode head, int val) { if(head.next==null) return null; ListNode t=new ListNode(1); t.next=head; while(t.next!=null){ if(t.next.val==val){ if(t.next.val== head.val){ return head.next; } if(t.next.next!=null) { t.next=t.next.next; } else t.next=null; return head; } t=t.next; } return head; }}
删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回 ...













