java基础教程 https://www.52dixiaowo.com/java 52的小窝 Mon, 14 Jun 2021 17:17:21 +0000 zh-CN hourly 1 https://wordpress.org/?v=5.8.1 https://www.52dixiaowo.com/java/wp-content/themes/zhufenghua/favicon.ico java基础教程 https://www.52dixiaowo.com/java 32 32 @RequestHeader注解 https://www.52dixiaowo.com/java/post-1385.html https://www.52dixiaowo.com/java/post-1385.html#respond Mon, 14 Jun 2021 17:17:21 +0000 https://www.52dixiaowo.com/java/?p=1385 此注解,作用在形式参数前,用于绑定http协议的header

实例

@RestController
public class Header {

	@GetMapping("/getHeader")
	public String getRequestHeader(@RequestHeader("User-Agent") String agent) {
		System.out.println(agent);
		return agent;
	}

}

]]>
https://www.52dixiaowo.com/java/post-1385.html/feed 0
@GetMapping,@PostMapping https://www.52dixiaowo.com/java/post-1383.html https://www.52dixiaowo.com/java/post-1383.html#respond Mon, 14 Jun 2021 16:18:06 +0000 https://www.52dixiaowo.com/java/?p=1383 继续阅读 @GetMapping,@PostMapping]]> 这两个注解, 分别是get, post方式时的简化注解

它本质是@RequestMapping + method为get, post 的组合注解

]]>
https://www.52dixiaowo.com/java/post-1383.html/feed 0
@RestController注解 https://www.52dixiaowo.com/java/post-1382.html https://www.52dixiaowo.com/java/post-1382.html#respond Mon, 14 Jun 2021 16:14:46 +0000 https://www.52dixiaowo.com/java/?p=1382 继续阅读 @RestController注解]]> 此注解, 作用于类上,

作用相当于 @Controller + @ResquestBody

也就是此类的所有方法, 都会直接返回数据到页面, 而不是转发给动态模板

]]>
https://www.52dixiaowo.com/java/post-1382.html/feed 0
@RequestParam,@RequestBody https://www.52dixiaowo.com/java/post-1377.html https://www.52dixiaowo.com/java/post-1377.html#respond Sun, 13 Jun 2021 19:08:43 +0000 https://www.52dixiaowo.com/java/?p=1377 继续阅读 @RequestParam,@RequestBody]]> 这两个都是springMVC的注解

@RequestParam

此注解用于方法的形式参数前, 这是用于接收请求参数的注解, 把前端参数封装为形式参数

简单理解为,完成原 HttpServletRequest 对象的功能,但又不完全相同(参数中仍能使用HttpServletRequest, 以及HttpServletResponse)

由于SpringMVC中,每一个业务处理是在方法中,不再有request对象为参数,所以使用此注解接收参数

@RequestParam(value=”参数名”,required=”true/false”,defaultValue=”默认值”)

  • value –> 前端传递的参数名,必须
  • required –> 前端必须传递此参数?默认true
  • defaultValue –> 当参数不存在时指定默认值

@ResponseBody

此注解,可以用于方法或类体上,此注解无属性

使用了此注解的方法,不会通过动态视图模板渲染返回数据,而是直接返回给浏览器

用在类上时,那么当前类中所有包含了@RequestMaping注解的方法都会生效。

]]>
https://www.52dixiaowo.com/java/post-1377.html/feed 0
@Controller,@RequestMapping https://www.52dixiaowo.com/java/post-1376.html https://www.52dixiaowo.com/java/post-1376.html#respond Sun, 13 Jun 2021 12:37:08 +0000 https://www.52dixiaowo.com/java/?p=1376 继续阅读 @Controller,@RequestMapping]]> @Controller

SpringMVC中, @Controller注解, 作用于类上, 标明当前类是一个Controller, 即业务层对象,

这个注解, 可以简单理解为, 标明一个类为 Servlet, 此注解无属性

和SpringBoot中相似, 仅有这个注解, 并没有什么意义, 原因是它必须配合其他注解一起使用, 比如使用了@RequestMapping, 它才是真正的请求处理器

@RequestMapping

此注解, 作用于类, 或者方法上, 用于处理请求

简单理解为, 原 WebServlet注解, 不过区别还是很大的

仅使用 @Controller 和 @RequestMapping, 无法直接返回数据, 例如

@Controller
public class HelloController {

    @RequestMapping(value="/hello",method= RequestMethod.GET)
    public String sayHello(){
        return "hello";
    }
}

这是因为, SpringMVC 需要配上视图解析器, 而视图解析器仅支持以下模板

  • FreeMarker
  • Groovy
  • Thymeleaf (Spring 官网使用这个)
  • Velocity
  • JSP

对于前后端分离, 还需要@RequestBody, 这样它才能直接返回

requestMapping的属性如下:

  • name –> 相当于servlet中的name
  • path –> 相当于servlet中的urlPattern
  • value –> 相当于servlet的value, 一个参数时默认
  • params –> 相当于servlet的params
  • method –> 指定请求的方式
  • header –> 指定请求头
  • consumers –> 指定请求参数的格式
  • produces –> 指定响应的格式, 即contentType

注解用于类上时, 会叠加到方法上, 比如类上path=user, 那么此方法内的所有方法都会添加到方法路径添加一个user起始路径

]]>
https://www.52dixiaowo.com/java/post-1376.html/feed 0
springMVC简介 https://www.52dixiaowo.com/java/post-1375.html https://www.52dixiaowo.com/java/post-1375.html#respond Sun, 13 Jun 2021 10:30:43 +0000 https://www.52dixiaowo.com/java/?p=1375 继续阅读 springMVC简介]]> SpringMVC是一种基于 Java 实现的 MVC 设计模型的请求驱动类型的轻量级 Web 框架, 属于 SpringFrameWork 的后续产品, 已经融合在 Spring Web Flow 里。

Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 进行 Web 开发时, 可以选择使用 Spring MVC 框架或者其他MVC框架, 如 Struts2 等

Spring MVC 已经成为目前最主流的 MVC 框架之一, 并且随着 Spring 3.0 的发布, 全面超越 Struts2, 成为最优秀的 MVC 框架。

它通过一套注解, 让一个简单的 Java 类成为处理请求的控制器, 而无需实现任何接口。同时它还支持 RESTful 编程风格的请求。

SpringMVC 的底层仍然是基于 Servlet 来实现的

SpringMVC的优势

  1. 清晰的角色划分
    • 前端控制器( DispatcherServlet )
    • 请求到处理器映射( HandlerMapping )
    • 处理器适配器( HandlerApapter )
    • 视图解析器( ViewResolver )
    • 处理器或页面控制( Controller )
    • 验证器( Validator )
    • 命令对象( Command 即: 请求参数绑定到的对象)
    • 表单对象( Form Object 即: 提供给表单展示和提交到的对象)
  2. 分工明确, 而且扩展点相当灵活, 可以很容易扩展
  3. 由于命令对象就是一个POJO, 无需继承框架特定API, 可以使用命令对象直接作为业务对象
  4. 和 Spring 其他框架无缝集成, 是其他 Web 框架所不具备的
  5. 可适配, 通过 HandlerAdapter 可以支持任意的类作为处理器
  6. 可定制性, HandlerMapping、ViewResolver 等能够非常简单的定制
  7. 功能强大的数据验证、格式化、绑定机制。
  8. 利用 Spring 提供的 Mock 对象能够非常简单的进行 Web 层单元测试
  9. 本地化、主题的解析的支持, 使我们更容易进行国际化和主题的切换
  10. 强大的 JSP 标签库, 使 JSP 编写更容易……

]]>
https://www.52dixiaowo.com/java/post-1375.html/feed 0
String Tokenizer — 字符串分割 https://www.52dixiaowo.com/java/post-1374.html https://www.52dixiaowo.com/java/post-1374.html#respond Tue, 08 Jun 2021 04:55:56 +0000 https://www.52dixiaowo.com/java/?p=1374 继续阅读 String Tokenizer — 字符串分割]]> java.util.StringTokenizer是在java.util包下的一个字符串分割工具

中文文档, 可参考StringTokenizer

1.简单使用

下面是一个使用 tokenizer 的实例。代码如下:

     StringTokenizer st = new StringTokenizer("this is a test");
     while (st.hasMoreTokens()) {
         System.out.println(st.nextToken());
     }
 

输出以下字符串:

     this
     is
     a
     test

使用新方式

StringTokenizer 是出于兼容性的原因而被保留的遗留类(虽然在新代码中并不鼓励使用它)。建议所有寻求此功能的人使用 String 的 split 方法或 java.util.regex 包。

下面的示例阐明了如何使用 String.split 方法将字符串分解为基本标记:

     String[] result = "this is a test".split("\\s");
     for (int x=0; x<result.length; x++)
         System.out.println(result[x]);
 

输出以下字符串:

     this
     is
     a
     test
]]>
https://www.52dixiaowo.com/java/post-1374.html/feed 0
spring的AOP https://www.52dixiaowo.com/java/post-1373.html https://www.52dixiaowo.com/java/post-1373.html#respond Tue, 01 Jun 2021 07:01:52 +0000 https://www.52dixiaowo.com/java/?p=1373 继续阅读 spring的AOP]]> springAOP(Aspect Oriented Programming) 也称为切面编程

之所以得到这个名称, 也是翻译过来的,光看名字其实不太好理解

AOP解决了什么问题?

aop本身不是取代oop, 而是oop的一种补充, 我们看一下下面这个代码

insert(){ //插入一条数据
   //1.参数验证
   checkArgs(); //参数验证方法
   //2.前置日志
   beforeLog();
   //3.核心, 添加数据
   add();
   //4.后置日志
   afterLog();
}
delete(){ //删除一条数据
   //1.参数验证
   checkArgs(); //参数验证方法
   //2.前置日志
   beforeLog();
   //3.核心, 删除数据
   sub();
   //4.后置日志
   afterLog();
}

在上面这个oop代码中, 可以清晰的看到, 当不同的方法中, 存在相同的逻辑处理时, 往往通过抽取共同的代码封装为方法, 然后再调用, 但这样的做法耦合依然太高. 在添加时需要先有这个方法, 通用方法删除时所有调用的也要去掉这一部分, 否则编译不通过

我们都知道, 代码肯定要先被实例化到内存中, 那么我们为何不在内存中动态给方法插入通用方法呢?这样一来是不是代码就只需要写各自的核心部分就可以了, 这就是springAOP给出的解决方案.

简单点说, springAOP就是在运行时(内存中), 动态给方法或某个位置插入代码, 至于为何取名切面编程, 也许是因为先切开, 再插入代码, 比较形象而取名

springAOP有多种实现方式, 比如代理模式.

]]>
https://www.52dixiaowo.com/java/post-1373.html/feed 0
spring的IOC/DI https://www.52dixiaowo.com/java/post-1372.html https://www.52dixiaowo.com/java/post-1372.html#respond Tue, 01 Jun 2021 06:34:34 +0000 https://www.52dixiaowo.com/java/?p=1372 继续阅读 spring的IOC/DI]]> spring框架, 有两大核心部分, 分别是

  • spring的 IOC/DI
  • spring的 AOP

其中, IOC和DI虽然不是同一个概念, 却是同一个概念的不同角度描述

IOC: 控制反转

spring的IOC, 也称为控制反转, 控制反转是从容器角度描述的

springIOC解决了什么问题呢? 首先我们来看一下下面的代码, 分析下oop的依赖

//登录验证
//1.获取用户名和密码
String uname = request.getParameter("uname");
String upwd = request.getParameter("upwd");
//2.根据参数, 调用dao查询数据库, dao实现类判断true or false
boolean loginSucess = new LoginDaoImpl().loginCheck(uname,upwd);

上面的代码中, 我们必须先写上LoginDaoInpl这个类, 并且实现这个方法, 否则编译不通过, 传统的oop代码中, 代码互相依赖很强, 也就是耦合度很高

springIOC的目的是为了代码解耦, 在上面这个例子中, 你可以理解为controller层(业务层)直接调用了bean(组件), springIOC则禁止coltroller直接调用bean, 我们把bean交给spring容器管理, 而controller从容器中获取bean, 这样一来编译期依赖就会减少, 至少编译能通过, 这也意味着代码从逻辑上更容易理解.

springIOC通过容器作为中间对象, 减少了controller和bean之间的耦合度

DI: 依赖注入

springIOC算是一种思想, 而springDI是它的一种简单实现方式

我们如何把bean交给spring容器管理? DI则是这样的实现方式, 类似于Maven这样的pom.xml导入依赖坐标的方式, DI同样使用xml的方式把bean注入到容器中, 这也就是依赖注入

为了简化依赖注入, 有更简单的注解注入方式

综上, springIOC/DI其实表达的是同一个思想, 但它们是在不同角度的理解.

]]>
https://www.52dixiaowo.com/java/post-1372.html/feed 0
springboot主函数 https://www.52dixiaowo.com/java/post-1371.html https://www.52dixiaowo.com/java/post-1371.html#respond Sun, 30 May 2021 15:29:32 +0000 https://www.52dixiaowo.com/java/?p=1371 继续阅读 springboot主函数]]> 了解一下springboot的主函数, 其中代码如下:

@SpringBootApplication
public class SpdevtoolsApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpdevtoolsApplication.class, args);
    }

}

springboot中的主函数, 作为程序的入口点, 如果是web程序, 会开启一个server

一个项目中, 应该有一个main函数, 而不是多个, 如果是多个需要进行额外的配置, 否则可能运行出错

main函数, 点开这个run方法, 源代码如下

    public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
        return run(new Class[]{primarySource}, args);
    }

我们不难发现, 它实际上它是创建了一个对象数组, 它再次调用的run方法为

    public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
        return (new SpringApplication(primarySources)).run(args);
    }

到这里, 我们看到它再次调用了run方法, 这次仍然很复杂, 但至少能看到是实例化了springapplication这个类, 由于代码较长, 需要自行查阅

这个springapplication主要干了以下几件事

  • 推断应用是普通项目还是web项目, 以确定要开启的是什么服务
  • 扫描并自动加载所有可用初始化器, 设置到initializers属性中
  • 找出所有的应用程序监听器, 设置到listeners属性中
  • 推断并设置main方法的定义类, 找到运行的主类

结论是 : 传入的class必须是被自动配置的, 也就是@EnableAutoConfiguration, 也可以是包含了@EnableAutoConfiguration的组合注解, 启动后和main方法同级的类, 包均能被自动加载

]]>
https://www.52dixiaowo.com/java/post-1371.html/feed 0