首页
碎碎念
技术分享
开发日志
学习日记
追剧
番
电视剧
电影
闲言碎语
精美壁纸
留言板
个人导航
关于我
归档
用户登录
用户名
密码
登录
注册
关键词搜索
搜索
标签搜索
java
追番~~
计网
c#
unity
脆皮大学生
spring AOP
博客更新
selenium
web测试
springboot
ES6
vue3
elementPlus
idea
近期浏览
热门文章
1
动漫分享---《想要成为影之实力者》
1.4k 阅读
2
在unity中使用c#语言实现人物的转身
1.4k 阅读
3
可恶的日本军国主义!我们一定不能遗忘这段历史,遗忘历史就意味着背叛!!!!
1.4k 阅读
4
Java与Selenium自动化测试全面指南
1.3k 阅读
5
Unity冲刺机制:如何实现角色冲刺
1.3k 阅读
6
SpringMVC 入门教程(基于Java配置类)
1.3k 阅读
7
子网划分与CIDR
1.3k 阅读
8
我的第一个blog
1.2k 阅读
9
分享键盘
1.1k 阅读
日高小春
累计撰写
54
篇文章
累计添加
17
个标签
累计收到
50
条评论
首页
分类
碎碎念
技术分享
开发日志
学习日记
追剧
番
电视剧
电影
页面
闲言碎语
精美壁纸
留言板
个人导航
关于我
归档
用户登录
登录
注册
“学习日记” 共(42)篇
Spring MVC Web项目配置指南
引言在Java企业级开发中,Spring MVC框架因其强大的功能、灵活的配置方式以及良好的扩展性而被广泛使用。配置Spring MVC通常有两种方式:一种是传统的基于XML的配置,另一种是基于注解和配置类的方式。本文将详细介绍这两种配置方式。传统XML配置方式web.xml配置在基于XML的配置中,web.xml扮演着重要的角色。它是Java EE的标准部署描述文件,用于配置Servlet、Filter等。DispatcherServlet配置 首先,我们需要在web.xml中配置DispatcherServlet,这是Spring MVC框架的核心。通过它来将请求分发到不同的处理器。<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>ContextLoaderListener配置 接着配置ContextLoaderListener,它用于加载Spring的根应用上下文。<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>springmvc.xml配置springmvc.xml是Spring MVC的核心配置文件,在这里我们配置了组件扫描、视图解析器等。组件扫描 首先要配置组件扫描,这样Spring才能找到我们定义的Controller。<context:component-scan base-package="com.example.controller" />视图解析器配置 然后配置视图解析器,它定义了如何将视图名称解析为具体的视图页面。<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean>更多配置 根据需要,我们还可以配置拦截器、多文件上传解析器等。注解与配置类方式随着Spring的发展,基于Java的配置越来越受到欢迎。下面将介绍如何通过注解和配置类来配置Spring MVC。创建配置类我们首先创建一个配置类WebAppConfig,并使用@Configuration注解标识它作为配置类。@Configuration @EnableWebMvc @ComponentScan(basePackages = "com.example.controller") public class WebAppConfig implements WebMvcConfigurer { // 配置视图解析器 @Override public void configureViewResolvers(ViewResolverRegistry registry) { registry.jsp("/WEB-INF/views/", ".jsp"); } // 可以继续添加其他配置... }初始化DispatcherServlet为了替代web.xml,我们需要实现WebApplicationInitializer接口来配置DispatcherServlet。public class WebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { // 创建WebApplicationContext AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext(); ac.register(WebAppConfig.class); ac.setServletContext(servletContext); // 注册DispatcherServlet ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ac)); servlet.addMapping("/"); servlet.setLoadOnStartup(1); } }结语以上便是Spring MVC项目在传统XML配置和基于注解与配置类的方式下的配置过程。开发者可以根据项目需求和个人偏好选择适合的配置方式。随着技术的发展,注解与配置类方式由于其简洁性,越来越受到开发者的喜爱。
1年前
312
0
1
Java中的ArrayList:深入探索与实践指南
在Java的集合框架中,ArrayList是最常用的数据结构之一。无论你是新手还是经验丰富的开发者,理解ArrayList及其功能都是非常有价值的。在本篇博客中,我们将深入探索ArrayList,了解其如何工作,如何使用,以及注意事项。1. ArrayList简介ArrayList是一个动态数组,它可以自动扩展其大小以适应新增的元素。它实现了List接口,因此它是有序的(你添加元素的顺序会被保留)并且可以包含重复的元素。2. 如何使用ArrayList2.1 创建和初始化你可以这样创建一个ArrayList:ArrayList<String> names = new ArrayList<>();或者在创建时初始化一些元素:ArrayList<String> fruits = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry")); ArrayList<String> moreFruits = new ArrayList<>(fruits);// 使用已有集合初始化ArrayList2.2 添加元素使用add方法添加元素:fruits.add("Date");你也可以在指定位置插入元素:fruits.add(1, "Avocado");2.3 访问元素使用get方法通过索引访问元素:String firstFruit = fruits.get(0); // Apple2.4 修改元素使用set方法:fruits.set(0, "Apricot");2.5 删除元素使用remove方法可以通过索引或直接通过对象删除:fruits.remove(0); // 通过索引删除 fruits.remove("Banana"); // 通过对象删除2.6 其他常用方法int size = fruits.size(); // 获取ArrayList的大小 boolean contains = fruits.contains("Cherry"); // 检查元素是否存在 fruits.clear(); // 清空ArrayList boolean isEmpty = fruits.isEmpty();// 检查ArrayList是否为空3. 遍历ArrayList你可以使用多种方法遍历ArrayList:// 使用传统的for循环 for (int i = 0; i < fruits.size(); i++) { System.out.println(fruits.get(i)); } // 使用增强的for循环 for (String fruit : fruits) { System.out.println(fruit); } // 使用Java 8的forEach和Lambda表达式 fruits.forEach(fruit -> System.out.println(fruit));4. 注意点与建议4.1 性能考虑ArrayList在末尾添加元素非常快,但在列表中间插入或删除元素可能会比较慢,因为需要移动元素。如果你知道最终列表的大小,最好在创建时指定其初始容量,这有助于提高性能。4.2 线程安全性ArrayList不是线程安全的。如果你需要在并发环境中使用,考虑使用Vector或Collections.synchronizedList。4.3 避免ConcurrentModificationException当遍历列表的同时修改它时(例如,在一个for-each循环中删除元素),会抛出ConcurrentModificationException。为了避免这种情况,你可以使用Iterator的remove方法。4.4 动态扩容ArrayList在内部使用数组来存储元素。当添加的元素超过其当前容量时,它会自动增长。但频繁的扩容可能会导致性能问题。如果你知道数据的大致大小,可以在初始化时指定其容量:ArrayList<String> largeList = new ArrayList<>(1000);4.5 null 元素ArrayList允许存储null元素。但在处理ArrayList时要特别小心,以避免NullPointerException。结论ArrayList是Java中非常有用的工具,提供了动态数组的功能和灵活性。无论你是在编写简单的脚本还是复杂的应用程序,都会发现它非常有用。
1年前
381
0
3
Java抽象类、抽象方法与接口深度探讨
Java是一门面向对象的编程语言,其中有几个关键概念帮助我们构建灵活和强大的代码,其中最核心的是抽象类、抽象方法和接口。这篇博客将为您展示这些概念的工作方式、用途和注意点。1. 抽象类与抽象方法1.1 定义与示例抽象类是不能被实例化的类,它可能包含一个或多个抽象方法。抽象方法是没有具体实现的方法,只有声明。abstract class Animal { // 抽象方法 abstract void sound(); // 普通方法 void breathe() { System.out.println("呼吸空气"); } } class Dog extends Animal { // 实现父类的抽象方法 void sound() { System.out.println("狗汪汪叫"); } }1.2 用途与好处模板设计:抽象类为子类提供一个通用的模板,确保子类遵循某种规范。代码重用:抽象类可以有具体的实现,减少重复代码。1.3 注意点与缺陷抽象类不能被实例化。如果一个类继承了一个抽象类,则它必须实现该抽象类的所有抽象方法,除非它自己也是一个抽象类。一个类不能继承多个抽象类,因为Java不支持多重继承。2. 接口2.1 定义与示例接口是一个完全抽象的结构,它包含了一组抽象方法。Java 8之后,接口可以包含默认方法和静态方法。interface Swimmable { // 抽象方法 void swim(); // 默认方法 default void breatheInWater() { System.out.println("通过鳃呼吸"); } } class Fish implements Swimmable { @Override public void swim() { System.out.println("鱼在水中游泳"); } }2.2 用途与好处多重继承:Java不允许一个类继承多个类,但一个类可以实现多个接口。灵活性:允许一个类实现任意数量的方法,而不必实现接口中的所有方法。2.3 注意点与缺陷接口中的所有方法默认都是public的,你不能为它们使用其他访问修饰符。在Java 8之前,接口不能包含具体实现,这限制了代码重用。虽然默认方法允许我们在接口中加入新的方法,但可能导致与实现该接口的类的其他方法发生冲突。3. 综合示例abstract class Vehicle { abstract void run(); } interface Flyable { void fly(); } class Airplane extends Vehicle implements Flyable { @Override public void run() { System.out.println("在跑道上跑"); } @Override public void fly() { System.out.println("在空中飞"); } }这里,Airplane是一个既可以在地面跑又可以在空中飞的交通工具,通过结合抽象类和接口,我们可以很好地表示这种复杂的关系。
1年前
397
0
1
深入Java多态性
Java中的多态性是面向对象编程的核心概念之一,它增强了代码的可读性、灵活性和可维护性。但理解它的细节并不总是那么直观。在这篇博客中,我们将通过具体的示例来探讨多态性的工作原理和常见的陷阱。1. 多态的基础首先,让我们从一个简单的示例开始,以理解多态性的基本概念。class Animal { void sound() { System.out.println("动物发出声音"); } } class Dog extends Animal { void sound() { System.out.println("狗汪汪叫"); } } class Cat extends Animal { void sound() { System.out.println("猫喵喵叫"); } } public class TestPolymorphism { public static void main(String[] args) { Animal myDog = new Dog(); Animal myCat = new Cat(); myDog.sound(); // 输出:狗汪汪叫 myCat.sound(); // 输出:猫喵喵叫 } }尽管我们使用的是Animal类型的引用,但在运行时,实际调用的方法是基于对象的真实类型。这就是运行时多态的魔力。2. 字段与多态与方法不同,字段不是多态的。这意味着字段的访问基于引用变量的类型,而不是对象的实际类型。这可以通过以下示例来说明:class Animal { String name = "动物"; } class Dog extends Animal { String name = "狗"; } public class TestFieldPolymorphism { public static void main(String[] args) { Animal myDog = new Dog(); System.out.println(myDog.name); // 输出:动物 } }尽管myDog实际上是一个Dog对象,但输出的仍然是"动物",因为字段的访问不是多态的。3. final、static和private与多态这些修饰符会影响到多态性。为了演示这一点,让我们考虑以下示例:class Animal { final void finalMethod() { System.out.println("这是一个final方法,不能被重写"); } static void staticMethod() { System.out.println("静态方法与类相关,不是多态的"); } private void privateMethod() { System.out.println("私有方法在子类中不可见,不能被重写"); } } class Dog extends Animal { // 下面的代码会报错,因为final方法不能被重写 // void finalMethod() {} // 这不是重写,只是子类中的一个新方法 static void staticMethod() { System.out.println("Dog类的静态方法"); } }4. 类型转换与多态在使用多态时,尤其是在类型转换中,我们需要小心。以下是一个常见的陷阱:Animal animal = new Animal(); Dog dog = (Dog) animal; // 这将抛出一个ClassCastException为避免这种情况,我们应使用instanceof进行检查:if(animal instanceof Dog) { Dog dog = (Dog) animal; }
1年前
404
0
1
Java与Selenium自动化测试全面指南
{lamp/}在当今的技术世界中,自动化测试已经成为确保软件质量的关键环节。Selenium是其中最受欢迎的自动化测试工具之一,它允许我们自动化Web应用程序。本文将为你详细介绍如何使用Java与Selenium进行自动化测试。基本操作1. 启动浏览器在使用Selenium进行测试之前,我们首先需要启动一个浏览器实例。WebDriver driver = new ChromeDriver();示例解释: 上面的代码将会启动一个新的Chrome浏览器窗口。确保你已经下载了与你的浏览器版本匹配的ChromeDriver并将其添加到系统路径中。2. 打开网页一旦浏览器启动,你可能想要导航到某个特定的网址。driver.get("https://www.example.com");示例解释: 这将指示浏览器导航到 "https://www.example.com" 这个URL。3. 获取页面标题在许多测试场景中,验证页面标题是一个常见的步骤,因为它帮助我们确认我们是否在正确的页面上。String title = driver.getTitle(); System.out.println(title);示例解释: getTitle() 方法会获取当前页面的标题,然后我们将其打印到控制台。4. 退出浏览器完成测试后,最好关闭浏览器以释放资源。driver.quit();示例解释: quit() 方法将关闭浏览器及其所有打开的窗口/标签页。请注意,这与 close() 方法不同,后者只关闭当前窗口或标签页。元素定位1. 通过ID定位如果页面元素具有唯一的ID,这通常是最可靠的方式。HTML 示例:<button id="submitBtn">提交</button>Selenium 代码:WebElement btn = driver.findElement(By.id("submitBtn")); btn.click();2. 通过Class Name定位有时,元素可能没有ID,但它们可能有一个或多个类。HTML 示例:<div class="content-box highlight">Hello World</div>Selenium 代码:WebElement content = driver.findElement(By.className("content-box")); System.out.println(content.getText());3. 通过Tag Name定位对于某些标签,如<a>或<p>,可以直接使用标签名定位。HTML 示例:<p>This is a paragraph.</p>Selenium 代码:WebElement paragraph = driver.findElement(By.tagName("p")); System.out.println(paragraph.getText());4. 通过XPath定位XPath是一种在XML文档结构中定位元素的语言。它非常强大,可以用于复杂的查询。HTML 示例:<div><span>Message</span></div>Selenium 代码:WebElement message = driver.findElement(By.xpath("//div/span")); System.out.println(message.getText());5. 通过CSS Selector定位CSS选择器用于样式网页,但也可以用于定位元素。HTML 示例:<div id="main"><a href="#">Link</a></div>Selenium 代码:WebElement link = driver.findElement(By.cssSelector("#main a")); link.click();高级交互1. 鼠标悬停有时,当鼠标悬停在某个元素上时,可能会出现下拉菜单或其他元素。HTML 示例:<div id="menu">鼠标悬停显示下拉菜单 <div id="submenu">子菜单</div> </div>Selenium 代码:WebElement menu = driver.findElement(By.id("menu")); Actions action = new Actions(driver); action.moveToElement(menu).perform();2. 拖放操作您可以使用Selenium来模拟拖放操作。HTML 示例:<div id="draggable">拖动我</div> <div id="droppable">放到这里</div>Selenium 代码:WebElement sourceElement = driver.findElement(By.id("draggable")); WebElement targetElement = driver.findElement(By.id("droppable")); Actions action = new Actions(driver); action.dragAndDrop(sourceElement, targetElement).perform();3. 右键点击模拟右键点击(上下文点击)某个元素。HTML 示例:<div id="contextMenu">右键点击这里</div>Selenium 代码:WebElement element = driver.findElement(By.id("contextMenu")); Actions action = new Actions(driver); action.contextClick(element).perform();4. 按下按键在某些场景下,您可能需要按下某些键,例如SHIFT或CONTROL。HTML 示例:<input type="text" id="inputField">Selenium 代码:WebElement inputField = driver.findElement(By.id("inputField")); Actions action = new Actions(driver); action.keyDown(Keys.SHIFT) .sendKeys(inputField, "hello world") .keyUp(Keys.SHIFT) .perform();示例解释: 这将在输入字段中大写地输入“HELLO WORLD”。等待机制在Web自动化测试中,等待是一个重要的概念。由于Web页面的元素可能需要一些时间来加载,直接执行某些操作可能会导致元素未找到或其他问题。为了解决这个问题,Selenium提供了几种等待机制。以下是Selenium的等待机制及其示例。1. 隐式等待设置一个固定的等待时间,让WebDriver在查找每个元素之前都等待一定的时间。如果元素在这段时间内被找到,它会立即继续执行。Selenium 代码:driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);示例解释: WebDriver将等待最多10秒来查找页面上的元素。如果在10秒内找到了元素,它会继续;否则,它将抛出一个NoSuchElementException。2. 显式等待显式等待使用WebDriverWait配合ExpectedConditions来创建条件等待,直到满足某个条件或超时为止。HTML 示例:<button id="loadBtn">点击加载内容</button> <div id="content"></div>Selenium 代码:WebElement loadBtn = driver.findElement(By.id("loadBtn")); loadBtn.click(); WebDriverWait wait = new WebDriverWait(driver, 20); WebElement content = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("content")));示例解释: 代码首先点击一个按钮加载内容。然后,它将等待最多20秒,直到ID为content的元素变得可见。3. Fluent 等待Fluent等待提供了更多的灵活性来定义等待的条件和频率。Selenium 代码:Wait<WebDriver> fluentWait = new FluentWait<>(driver) .withTimeout(Duration.ofSeconds(30)) .pollingEvery(Duration.ofSeconds(2)) .ignoring(NoSuchElementException.class); WebElement element = fluentWait.until(driver -> driver.findElement(By.id("someElement")));示例解释: 上述代码将等待30秒查找一个元素,每2秒尝试一次。如果在这段时间内它找到了元素,它会继续;否则,它将抛出一个异常。处理特殊元素1. 处理弹出框 (Alerts)JavaScript 弹出框是一个简单的对话框,它提供了一个消息和一个“确定”按钮。HTML 示例:<button onclick="alert('Hello!')">点击显示弹出框</button>Selenium 代码:driver.findElement(By.xpath("//button[text()='点击显示弹出框']")).click(); Alert alert = driver.switchTo().alert(); String alertText = alert.getText(); alert.accept();示例解释: 首先,我们点击按钮来触发弹出框。然后,我们使用switchTo().alert()来切换到弹出框,并获取其文本内容。最后,我们接受弹出框。2. 处理下拉菜单 (Dropdowns)下拉菜单允许用户从多个选项中选择一个。HTML 示例:<select id="dropdown"> <option value="option1">选项1</option> <option value="option2">选项2</option> </select>Selenium 代码:Select dropdown = new Select(driver.findElement(By.id("dropdown"))); dropdown.selectByVisibleText("选项2");示例解释: 我们首先找到下拉菜单元素,然后使用Select类来选择一个选项。3. 处理iframe有时,Web页面可能包含内嵌的iframe。要与iframe内的元素交互,我们需要先切换到iframe。HTML 示例:<iframe src="someURL" id="frame1"></iframe>Selenium 代码:driver.switchTo().frame("frame1"); // 在iframe中的操作 WebElement elementInsideFrame = driver.findElement(By.id("someElement")); // 切换回主内容 driver.switchTo().defaultContent();示例解释: 使用switchTo().frame()方法切换到iframe,然后可以正常地与其中的元素进行交互。完成后,再切换回主内容。4. 处理滚动有时,我们需要滚动页面以使某些元素可见。Selenium 代码:JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript("window.scrollBy(0,500)"); // 垂直滚动500像素示例解释: 我们使用JavascriptExecutor来执行JavaScript代码,实现页面滚动。{callout color="#f0ad4e"}操作指令描述WebDriver driver = new ChromeDriver();创建一个Chrome浏览器的WebDriver对象。driver.get("https://www.example.com");打开指定的网址。driver.findElement(By.id("elementId"));通过元素的ID查找元素。driver.findElement(By.name("elementName"));通过元素的名称查找元素。driver.findElement(By.className("className"));通过元素的类名查找元素。driver.findElement(By.tagName("tagName"));通过元素的标签名查找元素。driver.findElement(By.linkText("linkText"));通过链接文本查找链接元素。driver.findElement(By.partialLinkText("partialLinkText"));通过部分链接文本查找链接元素。driver.findElement(By.xpath("xpathExpression"));通过XPath表达式查找元素。driver.findElement(By.cssSelector("cssSelector"));通过CSS选择器查找元素。WebElement element = driver.findElement(By.id("elementId"));将找到的元素存储在WebElement对象中。element.click();单击元素。element.sendKeys("text");在输入字段中输入文本。element.clear();清除输入字段中的文本。element.getText();获取元素的可见文本。element.getAttribute("attributeName");获取元素的指定属性的值。element.isDisplayed();检查元素是否可见。element.isEnabled();检查元素是否可用。element.isSelected();检查复选框或单选框是否被选中。driver.switchTo().frame("frameName");切换到指定名称的iframe。driver.switchTo().defaultContent();切换回默认的内容。driver.getWindowHandle();获取当前窗口的句柄。driver.getWindowHandles();获取所有打开窗口的句柄。driver.switchTo().window(handle);切换到指定句柄的窗口。driver.close();关闭当前窗口。driver.quit();关闭浏览器并退出WebDriver。driver.switchTo().defaultContent();切换回默认的窗口上下文。driver.switchTo().frame(frameElement);切换到指定iframe元素。driver.switchTo().parentFrame();切换到父级iframe或窗口。driver.manage().window().maximize();切换到父级iframe或窗口。driver.manage().window().setSize();切换到父级iframe或窗口。{/callout}
1年前
1,326
3
7
使用Spring MVC进行RESTful开发
本篇文章将探讨如何使用Spring MVC构建一个遵循REST风格的Web API。我们将从REST的基本概念开始,然后演示如何用Spring创建一个简单的图书管理API。1. 什么是REST?REST,全称表示性状态传输(Representational State Transfer),不是一个标准或协议,而是一种设计风格。以下是其核心原则:无状态:每次请求应该包含所有信息。客户端-服务器架构。可缓存的响应。层次化的系统。使用标准的HTTP方法。资源是核心,每个资源有唯一的URI。2. 示例:图书管理API2.1 设计Book实体public class Book { private Long id; private String title; private String author; // getters, setters, constructors, etc. }2.2 创建RESTful Controller@RestController @RequestMapping("/api/books") public class BookController { //... 之前提到的所有方法 }2.3 URI设计和HTTP方法对于RESTful API,我们通常根据资源来设计URI,并使用HTTP方法表示操作:获取所有图书: 请求:GET /api/books 响应:200 OK + 图书列表获取特定ID的图书: 请求:GET /api/books/{id} 响应:200 OK + 图书详情添加图书: 请求:POST /api/books + JSON体 响应:200 OK + 创建的图书详情更新图书: 请求:PUT /api/books/{id} + JSON体 响应:200 OK + 更新后的图书详情删除图书: 请求:DELETE /api/books/{id} 响应:200 OK2.4 详细解读注解@RestController:这个控制器的所有方法返回的对象会被转换为JSON或XML格式。@RequestMapping:定义基础URI。@GetMapping, @PostMapping等:针对不同的HTTP操作定义方法。@PathVariable:捕获URI中的值。@RequestBody:将请求体的内容绑定到对象。3. 总结在本文中,我们探讨了RESTful的核心原则,并学习了如何使用Spring MVC构建一个简单的RESTful API。当然,真实的开发中会遇到更多的复杂情况,例如异常处理、验证、分页等。但这为您提供了一个基础的开始,帮助您理解和开始构建自己的RESTful服务。{music id="1412242872" color="#efafc5" autoplay="autoplay"/}
1年前
472
0
0
Spring与SpringMVC注解总览
1. Spring Core 注解:@Component作用:基本注解,标识一个受Spring管理的组件。示例:@Component public class ExampleComponent {}@Autowired作用:自动装配bean。可以对类的字段、构造函数和方法使用。示例:public class CarService { @Autowired private CarRepository carRepository; }@Qualifier作用:当有多个同类型的Bean时,指定需要注入哪一个。示例:@Autowired @Qualifier("specialCarRepository") private CarRepository carRepository;@Value作用:注入属性值。示例:@Value("${car.default-name}") private String defaultCarName;@Configuration作用:声明一个类作为Spring的配置类。示例:@Configuration public class AppConfig {}@Bean作用:在配置类中,此注解在方法上,表示该方法将返回一个对象,并将其注册为Spring应用上下文中的Bean。示例:@Configuration public class AppConfig { @Bean public Car car() { return new Car(); } }@Scope作用:指定Bean的范围(如单例或原型)。示例:@Bean @Scope("prototype") public Car car() { return new Car(); }@Profile作用:定义某个Bean只在某个Profile激活时才能使用。示例:@Configuration @Profile("development") public class DevConfig {}2. Spring MVC 注解:@Controller作用:标识一个类是Spring MVC的控制器。示例:@Controller public class CarController {}@RestController作用:是@Controller的一个特化版本,自动为所有响应添加@ResponseBody注解。示例:@RestController public class CarAPIController {}@RequestMapping作用:定义URL到控制器方法的映射。可以用于类或方法。示例:@Controller @RequestMapping("/cars") public class CarController { @RequestMapping("/view") public String viewCar() { } }@GetMapping, @PostMapping, @PutMapping, @DeleteMapping作用:是@RequestMapping的快捷方式,用于指定HTTP的方法类型。示例:@GetMapping("/list") public List<Car> listCars() { }@PathVariable作用:从URI模板中提取变量值。示例:@GetMapping("/{id}") public Car getCar(@PathVariable Long id) { }@RequestParam作用:提取请求参数的值。示例:@GetMapping("/search") public List<Car> searchCars(@RequestParam String make) { }@RequestBody作用:表示某个方法参数应该绑定到HTTP请求体。示例:@PostMapping("/add") public void addCar(@RequestBody Car car) { }@ResponseBody作用:表示方法返回的值应该绑定到HTTP响应体。示例:@Controller public class CarController { @GetMapping("/count") @ResponseBody public int countCars() { } }@ModelAttribute作用:绑定方法参数或方法返回值到命名的模型属性。示例:@ModelAttribute("car") public Car getCar(@RequestParam Long id) { }@SessionAttributes作用:指定模型属性应该存储在session中。示例:@Controller @SessionAttributes("car") public class CarController { }@InitBinder作用:自定义请求参数的绑定。示例:@InitBinder public void initBinder(WebDataBinder binder) { }@ExceptionHandler作用:处理控制器内部抛出的异常。示例:@ExceptionHandler(CarNotFoundException.class) public ResponseEntity<String> handleCarNotFound() { }
1年前
506
0
0
SpringMVC 入门教程(基于Java配置类)
1.介绍SpringMVC 是 Spring 框架的一部分,用于构建 web 应用程序。它是一个 MVC (Model-View-Controller) 框架,可以帮助我们更加便捷地开发 web 应用。2.开始之前确保你已经安装了以下工具:JDK 1.8 或更高MavenIDE(例如 IntelliJ IDEA 或 Eclipse)3.创建一个 Maven 项目在 IDE 中创建一个新的 Maven 项目,并选择 webapp 作为项目的类型。4.在 pom.xml 中添加依赖<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.x.x.RELEASE</version> </dependency>5.创建Controller类@RestController public class HelloController { @RequestMapping("/controller") @ResponseBody public String hello() { System.out.println("user controller"); return "{'module':'springmvc controller'}"; } } @RestController 这是一个组合注解,等同于@Controller和@ResponseBody的结合。当一个类使用了@RestController注解,它意味着这个类是一个Spring MVC控制器。由于它结合了@ResponseBody,所以这个控制器的方法返回值会自动被转换为JSON或XML响应,取决于客户端请求的Accept头部和配置的消息转换器。@RequestMapping("/controller") 这个注解用于指定一个URL映射,当用户访问/controller这个路径时,hello()方法会被调用。除了指定URL映射,@RequestMapping还可以用于指定HTTP方法(如GET、POST等)。@ResponseBody 这个注解告诉Spring MVC框架,该方法的返回值应当直接写入HTTP响应的body部分,而不是被解析为一个视图名称。在这个示例中,@ResponseBody实际上是冗余的,因为@RestController已经包含了这个功能。但在使用@Controller而不是@RestController的情况下,你会需要@ResponseBody来指示方法返回的是响应体内容。6.创建springmvc配置类创建一个名为 WebConfig 的Java类并使用 @Configuration 和 @EnableWebMvc 注解:@Configuration @ComponentScan(basePackages = "com.example.controller") public class WebConfig implements WebMvcConfigurer { } 7.创建servlet容器启动的配置类import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer; public class MyWebAppInitializer extends AbstractDispatcherServletInitializer { @Override protected String[] getServletMappings() { return new String[]{"/"}; } @Override protected WebApplicationContext createRootApplicationContext() { AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); rootContext.register(RootConfig.class); // 如果你有其他的Root配置类,例如安全配置或数据源配置 return rootContext; } @Override protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext servletContext = new AnnotationConfigWebApplicationContext(); servletContext.register(WebConfig.class); // 前面步骤中的WebConfig类 return servletContext; } }{card-describe title=" 代码解析 "}这里的 createRootApplicationContext() 方法用于配置Root ApplicationContext,通常用于其他的Spring配置,例如数据源、服务等。 createServletApplicationContext() 方法则用于配置Servlet ApplicationContext,通常用于Web相关的Bean,例如控制器、视图解析器等。 getServletMappings() 方法定义了DispatcherServlet的映射URL,这里我们将其映射到/,这意味着它将处理所有进入应用的请求。{/card-describe}现在,当你启动你的Web应用时,MyWebAppInitializer类将被自动识别并用于配置DispatcherServlet。8.配置tomcat启动插件在pom文件中插入如下代码:<build> <plugins> <!-- Other plugins --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <path>/yourAppName</path> <!-- Application path --> <port>8080</port> <!-- Port to run Tomcat --> <contextReloadable>true</contextReloadable> </configuration> </plugin> </plugins> </build>9.运行应用在Tomcat或其他web服务器中运行应用,并访问 http://localhost:8080/yourAppName/controller,得到如下显示:{ "message": "Hello, SpringMVC test!" }{lamp/}{music id="2019573476" color="#1989fa" autoplay="autoplay"/}
1年前
1,315
0
1
Unity角色移动机制:基于Rigidbody2D的水平移动
在Unity中实现2D角色的基本移动功能是游戏开发的重要基础。在这篇文章中,我们将探讨如何利用Rigidbody2D组件实现角色的水平移动。整体代码如下: public Rigidbody2D rb; private float xInput; [SerializeField] private float movespeed; void Start() { rb = GetComponent<Rigidbody2D>(); } private void Movement() { xInput = UnityEngine.Input.GetAxisRaw("Horizontal"); rb.velocity = new Vector2(xInput * movespeed, rb.velocity.y); } //这两段代码的作用是为了将unity中player的物理属性引用至代码中。 代码解析初始化刚体组件:首先,我们需要引用角色上的Rigidbody2D组件:public Rigidbody2D rb;这行代码声明了一个公共的Rigidbody2D类型的变量rb。该变量将用于访问角色的物理属性。在Start方法中,我们为rb变量赋值,确保它引用了当前游戏对象上附加的Rigidbody2D组件:void Start() { rb = GetComponent<Rigidbody2D>(); }这行代码的作用是获取当前游戏对象上附加的Rigidbody2D组件,并将其引用赋值给rb变量,在游戏开始时为其赋值。这样,当游戏开始时,我们就能够访问和控制角色的物理属性。实现水平移动:为了让角色在水平方向上移动,我们需要获取玩家的输入。在Unity中,这可以通过Input.GetAxisRaw方法来实现,它可以读取键盘的左右箭头键、A和D键或游戏控制器的水平轴输入:xInput = UnityEngine.Input.GetAxisRaw("Horizontal");xInput变量将存储一个范围从-1到1的值,代表玩家的水平输入方向。用来获取玩家的水平方向输入,这通常来自键盘的左右箭头键、A和D键,或者来自游戏控制器的横轴输入。-引用自chatgtp。接下来,我们要根据xInput来设置角色的速度。为此,我们更新rb的速度属性:rb.velocity = new Vector2(xInput * movespeed, rb.velocity.y);在这里,new Vector2(...) 是一个构造函数,xInput * movespeed计算出新的x轴速度。xInput是方向,movespeed是一个可以在Unity编辑器中设置的变量,可在unity中调节,代表角色的移动速度。rb.velocity是刚体的速度,而rb.velocity.y确保我们保持在y轴方向上的当前速度,这意味着它不会影响到角色的垂直移动。总结通过上述方法,我们在Unity中实现了基于Rigidbody2D的角色水平移动功能。利用Unity的物理引擎可以使角色的移动更为自然和真实。在日后的学习中,你可以进一步完善这个机制,例如添加跳跃功能、动画或其他高级控制。
1年前
743
0
0
Unity冲刺机制:如何实现角色冲刺
整体代码如下:[SerializeField] private float dashTime; [SerializeField] private float dashDuration; [SerializeField] private float dashSpeed; [SerializeField] private float dashCd; [SerializeField] private float dashCd2; void Update() dash(); dashCd -= Time.deltaTime; dashTime -= Time.deltaTime; private void Dash() { if (UnityEngine.Input.GetKeyDown(KeyCode.LeftShift)&&dashCd<=0&&!isAttacking) { dashTime = dashDuration; ;dashCd = dashCd2; } if (dashTime > 0) { rb.velocity = new Vector2(facingdir * dashSpeed, 0); } }代码解析初步设置:在开始之前,请确保你的角色上已经附加了一个刚体(在代码中被称为rb),因为我们将修改它的速度来创建冲刺效果。冲刺变量:[SerializeField] private float dashTime; [SerializeField] private float dashDuration;//冲刺时间 [SerializeField] private float dashSpeed;//为冲刺速度赋予数值 [SerializeField] private float dashCd; [SerializeField] private float dashCd2;//冲刺的冷却时间 在这里,我们定义了几个关键的序列化字段:dashTime:当前的冲刺时间。dashDuration:冲刺可以持续的总时间。dashSpeed:冲刺的速度。dashCd:冲刺的当前冷却时间。dashCd2:冲刺的总冷却时间。主要功能:void Update() { Dash(); dashCd -= Time.deltaTime; dashTime -= Time.deltaTime; }在Update函数中,我们持续减少冲刺的冷却时间和冲刺时间。Time.deltaTime是一个根据时间持续增加的float变量,dashCd -= Time.deltaTime;等同于dashCd = dashCd-Time.deltaTime;这样做可以给dashCd持续赋值,根据时间减小。在unity中可以为dashCd设置一个初始值,这样就可以获得一个拥有初始值且持续减小的变量。private void Dash() { if (UnityEngine.Input.GetKeyDown(KeyCode.LeftShift) && dashCd <= 0 && !isAttacking) { dashTime = dashDuration; dashCd = dashCd2; } if (dashTime > 0) { rb.velocity = new Vector2(facingdir * dashSpeed, 0); } }在Dash函数中,当玩家按下左Shift键并满足特定条件时(冷却时间已结束且角色不在攻击状态),角色将开始冲刺。冲刺时,角色的速度会增加,使其快速移动。{card-describe title="dashCd2和dashDuration"} { dashTime = dashDuration; dashCd = dashCd2; }dashCd2和dashDuration是上面我们创建的两个对象,在unity中将这两个变量设置成为两个正值,目的是当我们执行一次冲刺操作后将dashCd和dashTime可以恢复成两个正值。{/card-describe}总结:这是一个简单的冲刺机制实现。你可以根据需要进一步定制和完善这个机制,例如添加冲刺的动画或特效,以增强游戏的体验和视觉效果。
1年前
1,320
8
7
1
...
3
4
5
日高小春
54
文章数
17
标签数
50
评论量
在unity中使用c#语言实现人物的转身
Unity冲刺机制:如何实现角色冲刺
可恶的日本军国主义!我们一定不能遗忘这段历史,遗忘历史就意味着背叛!!!!
人生倒计时
热门文章
1
动漫分享---《想要成为影之实力者》
1447 阅读 - 10/11
2
在unity中使用c#语言实现人物的转身
1420 阅读 - 10/13
3
可恶的日本军国主义!我们一定不能遗忘这段历史,遗忘历史就意味着背叛!!!!
1356 阅读 - 10/17
标签云
java
追番~~
计网
c#
unity
脆皮大学生
spring AOP
博客更新
selenium
web测试
springboot
ES6
vue3
elementPlus
idea
舔狗日记