Spring基础(Web-MVC)——在idea中新建springWeb项目 & 浏览器请求 和 服务器响应 & SpringMvc文件相关_新建springmvc项目(1)

    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>

    <!-- 做web项目的包-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>2.0.22</version>
    </dependency>

</dependencies>

### 3.写主启动类Main.java文件@SpringBootApplication


要点:


* 是spingMvc的配置类:@SpringBootApplication;
* 启动: SpringApplication.run(Main.class);
* 目录层级的问题,和其他同级目录;


![在这里插入图片描述](https://img-blog.csdnimg.cn/0a501472b6f84308a963dfdaafede9d6.png)


Main.java文件



package com.tianju;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

/**
* springMvc的主启动类
* 1.本质是配置类;@SpringBootApplication :@Configuration是它的爷爷辈
* 2.启动容器,SpringApplication.run(Main.class);
*/
@SpringBootApplication
public class Main {
public static void main(String[] args) {
// 集成了的new对象,放容器,启动执行
ApplicationContext ac = SpringApplication.run(Main.class);
}
}


### 4.写application.yml文件spring的配置文件


要点:


* 文件名是 application.yml
* 颜色要是黄色,要有空格


![在这里插入图片描述](https://img-blog.csdnimg.cn/7b5b780abc43425c88ea4dd49d167f8d.png)


![在这里插入图片描述](https://img-blog.csdnimg.cn/04994b7248fc4657897d06818908653e.png)



server:
port: 80


### 5.启动,运行main.java就可以启动


![在这里插入图片描述](https://img-blog.csdnimg.cn/2c15e44f38cb4120a4d7a95485cf3db2.png)


## SpringMvc的浏览器请求初步


### 1.初识springMvc @RequestMapping(“/demo”)


要点:


* 1.controller要在容器中:@Controller
* 2.用来处理浏览器的请求:@RequestMapping(“/demo”)
* @RequestMapping(“/demo”)可以在类上,也可在方法上:一级、二级目录;


![在这里插入图片描述](https://img-blog.csdnimg.cn/3dccf42d4ae24be0b94f28160db80001.png)


ResponseControllerDemo.java文件



package com.tianju.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
* controller层,
* 1.在容器中: @Controller
* 2.用来处理网络请求:即 @RequestMapping(“/demo”)
* 既可以放在类上:一级目录;
* 也可以在方法上:二级目录:http://localhost/demo/hello
*/
@Controller
@RequestMapping(“/demo”) // 一级目录
public class ResponseControllerDemo {
@RequestMapping({“/hello”,“/hello2”}) // 二级目录
@ResponseBody
public String hello(){
return “Hello SpringMvc”;
}
}


![在这里插入图片描述](https://img-blog.csdnimg.cn/135dd03153bd44dbb1ed098257507aa9.png)


### 2.由@RequestMapping衍生出来的


@PostMapping,@GetMapping,@DeleteMapping,@PutMapping


![在这里插入图片描述](https://img-blog.csdnimg.cn/509b78f9cf774a988e24aa84c4c8f80a.png)


@RequestMapping


@PostMapping(“/hello”)  
 @GetMapping  
 @DeleteMapping  
 @PutMapping


#### 405异常:服务器只能处理post,浏览器请求的是get方法


![在这里插入图片描述](https://img-blog.csdnimg.cn/562337c970824b909277806e3edf9dbe.png)


## 浏览器请求Request传参数的方式


### 1.基础数据类型和String


要点:


* string不传默认是,空字符串;
* Integer不传,默认是null;



http://localhost/demo/hello?username=&age=



package com.tianju.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
* controller层,
* 1.在容器中: @Controller
* 2.用来处理网络请求:即 @RequestMapping(“/demo”)
* 既可以放在类上:一级目录;
* 也可以在方法上:二级目录:http://localhost/demo/hello
*/
@Controller
@RequestMapping(“/demo”) // 一级目录
public class ResponseControllerDemo {
@RequestMapping(“/hello”) // 二级目录
@ResponseBody
public String hello(String username,Integer age){
System.out.println(username);
System.out.println(age);
return “Hello SpringMvc”;
}
}


### 2.发送name,接收是username,@RequestParam(value = “name”)


要点:


* 默认必须传值,不传会报400异常;
* 如果不想传,就加required=false;
* 还可以给个默认值,defaultValue=“admin”;【应用:分页的时候,默认第一页,默认每页10条数据】



http://localhost/demo/hello?name=hell



@RequestMapping("/hello") // 二级目录
@ResponseBody
public String hello(@RequestParam(value = "name") String username){
    System.out.println(username);
    return "Hello SpringMvc";
}

#### 400异常,加了@RequestParam(value = “name”) 必须传值


![在这里插入图片描述](https://img-blog.csdnimg.cn/cbe905f964de4c20908e3deccd018a31.png)


#### 400异常,后端类型是Integer,前端传的是string,转换失败


![在这里插入图片描述](https://img-blog.csdnimg.cn/feba06f0ff564988b9d1f8a31dc210f1.png)


### 2.【应用】分页可以用@RequestParam(value = “pageNum”,defaultValue = “1”)



package com.tianju.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

/**
* controller层,
* 1.在容器中: @Controller
* 2.用来处理网络请求:即 @RequestMapping(“/demo”)
* 既可以放在类上:一级目录;
* 也可以在方法上:二级目录:http://localhost/demo/hello
*/
@Controller
@RequestMapping(“/demo”) // 一级目录
public class ResponseControllerDemo {
@RequestMapping(“/hello”) // 二级目录
@ResponseBody
public String hello(@RequestParam(value = “pageNum”,defaultValue = “1”) Integer pageNum,
@RequestParam(value = “pageSize”,defaultValue = “10”) Integer pageSize){
System.out.println(pageNum);
System.out.println(pageSize);
return “Hello SpringMvc”;
}
}


### 3.Rest风格的查询xxx/search/手机/白色----xxx/search?item=手机&color=白的


要点:


* 访问路径:@RequestMapping(“/search/{item}/{color}”);
* 获取参数:@PathVariable(“item”)


![在这里插入图片描述](https://img-blog.csdnimg.cn/281db5a40f1742459399b7a06b4dcbf0.png)



http://localhost/demo/search/mobilephone/red



package com.tianju.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.security.SignedObject;

/**
* controller层,
* 1.在容器中: @Controller
* 2.用来处理网络请求:即 @RequestMapping(“/demo”)
* 既可以放在类上:一级目录;
* 也可以在方法上:二级目录:http://localhost/demo/hello
*/
@Controller
@RequestMapping(“/demo”) // 一级目录
public class ResponseControllerDemo {

// http://localhost/demo/search/mobilephone/red
@RequestMapping("/search/{item}/{color}") // 二级目录
@ResponseBody
public String hello(@PathVariable("item") String item,
                    @PathVariable("color") String color){
    System.out.println(item);
    System.out.println(color);
    return "Hello SpringMvc";
}

}


### 4.后端用对象接收 + 数组/集合


要点:


* 可以用对象接收前端传来的数据,会自动做映射
* 可以传数组,或集合


![在这里插入图片描述](https://img-blog.csdnimg.cn/ede883234b5c4af284fd05638b2f8fc3.png)



http://localhost/demo/add/user?username=peter&password=123&hobby=learn&hobby=game



package com.tianju.controller;

import com.tianju.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.security.SignedObject;

/**
* controller层,
* 1.在容器中: @Controller
* 2.用来处理网络请求:即 @RequestMapping(“/demo”)
* 既可以放在类上:一级目录;
* 也可以在方法上:二级目录:http://localhost/demo/hello
*/
@Controller
@RequestMapping(“/demo”) // 一级目录
public class ResponseControllerDemo {

// http://localhost/demo/add/user?username=peter
// &password=123&hobby=learn&hobby=game
@RequestMapping("/add/user") // 二级目录
@ResponseBody
public String hello(User user){
    System.out.println(user);
    return "Hello SpringMvc";
}

}


### 5.日期的处理,默认格式2021/05/28,【未完待续】


要点:


* 默认只能发送2021/05/28格式的日期



http://localhost/demo/date?birthday=2021/05/28



package com.tianju.controller;

import com.tianju.entity.User;
import lombok.Data;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.security.SignedObject;
import java.util.Date;

/**
* controller层,
* 1.在容器中: @Controller
* 2.用来处理网络请求:即 @RequestMapping(“/demo”)
* 既可以放在类上:一级目录;
* 也可以在方法上:二级目录:http://localhost/demo/hello
*/
@Controller
@RequestMapping(“/demo”) // 一级目录
public class ResponseControllerDemo {

// http://localhost/demo/date?birthday=2021/05/28
@RequestMapping("/date") // 二级目录
@ResponseBody
public String hello(Date birthday){
    System.out.println(birthday);
    return "Hello SpringMvc";
}

}


#### 400异常,日期格式转换失败


Failed to convert from type [java.lang.String] to type [java.util.Date] for value ‘2021-5-28’; nested exception is java.lang.IllegalArgumentException]


![在这里插入图片描述](https://img-blog.csdnimg.cn/7534bbf25ec34179b8a4020157a885b4.png)


### 6.怎么获取请求头,cookie里的值,以及原来的request和response等


要点:


* 需要啥写啥;
* HttpServletRequest request,
* HttpSession httpSession,


![在这里插入图片描述](https://img-blog.csdnimg.cn/8f2ebdad785f4f069264178fffd923c1.png)



http://localhost/demo/set/session
http://localhost/demo/native



package com.tianju.controller;

import com.tianju.entity.User;
import lombok.Data;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.security.SignedObject;
import java.util.Date;

/**
* controller层,
* 1.在容器中: @Controller
* 2.用来处理网络请求:即 @RequestMapping(“/demo”)
* 既可以放在类上:一级目录;
* 也可以在方法上:二级目录:http://localhost/demo/hello
*/
@Controller
@RequestMapping(“/demo”) // 一级目录
public class ResponseControllerDemo {

// http://localhost/demo/date?birthday=2021/05/28
@RequestMapping("/native") // 二级目录
@ResponseBody
public String hello(HttpServletRequest request,
                    HttpSession httpSession,
                    HttpServletResponse response,
                    @RequestHeader("Connection") String connection,
                    @CookieValue("JSESSIONID") String jsessionid){
    // 1.request里面就可以获得session,之前servlet就是这样的
    HttpSession session = request.getSession();
    // 2.加上httpSession,也能获得;
    Object username = httpSession.getAttribute("username");
    System.out.println(username);
    System.out.println(response);
    System.out.println("----获取请求头里的connection------");
    System.out.println(connection);
    System.out.println(jsessionid);
    return "Hello SpringMvc";
}

@RequestMapping("/set/session")
@ResponseBody
public String setSession(HttpSession session){
    session.setAttribute("username", "peter");
    System.out.println(session);
    return "success";
}

}


请求头  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3821308e4712420b8a94dab81bfb6f29.png)获取connection和 jsessionid


![在这里插入图片描述](https://img-blog.csdnimg.cn/b472373eb95046ba8cb97357c18dbafb.png)


## 服务器响应Response—后端给前端发送内容


![在这里插入图片描述](https://img-blog.csdnimg.cn/a783f0a5e32d44f7885a8e5c05da9dae.png)


需要一个包,前端模板引擎,类似于jsp



    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

### 1.响应一个Json + 时间显示@JsonFormat【有坑】


要点:


* 响应是json,要加@ResponseBody;
* 时间显示的问题,要GMT+8:
* @JsonFormat(pattern = “yyyy-MM-DD hh:mm:ss”, timezone = “GMT+8”)
* 如果一个controller响应都是json则,可以用@RestController代替 @Controller 和 @ResponseBody


![在这里插入图片描述](https://img-blog.csdnimg.cn/0c819bb135b047f28ccd9db90f9b5977.png)


注意这里,日期转换格式写错了,DD要改成小写dd


![在这里插入图片描述](https://img-blog.csdnimg.cn/26c088d2aa4647ee890291a63a83eafb.png)


日期格式的转换



@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss",timezone = "GMT+8")
private Date birthday;

controller的代码



package com.tianju.controller;

import com.tianju.entity.ResData;
import com.tianju.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.Date;

/**
* 响应相关:1.响应json;2.响应页面
* 要点:
* 1.在容器@Controller;
* 2.路径;@RequestMapping(“/resp”);
* 3.如果是响应json,需要加@ResponseBody;
* 4.如果响应页面,则返回值是string
* 补充:如果一个controller响应都是json
* 则,@RestController代替 @Controller 和 @ResponseBody
*/
@Controller
@RequestMapping(“/resp”)
//@RestController // 等价于@Controller + @ResponseBody
public class ResponseControllerDemo {
@RequestMapping(“/json”)
@ResponseBody // 如果响应是json,必须加
public ResData respJson(){
User user = new User(“peter”, “123”,
new Date(), Arrays.asList(new String[]{“learn”,“movie”}));
return new ResData(200, “success”, user);
}
}


可以不写responseBody,用@RestController


![在这里插入图片描述](https://img-blog.csdnimg.cn/1abb06092fd648fa8cdb040746e2d91d.png)


### 2.响应一个页面,返回值String


要点:


* 1.返回值为string;
* 2.不能加Responsebody


![在这里插入图片描述](https://img-blog.csdnimg.cn/668022fec9cb4df3ba78af55773a9fc7.png)


服务器响应html代码,显示在前端页面上


![在这里插入图片描述](https://img-blog.csdnimg.cn/8eb37d953e1845e2a92c5d8f9085c4ed.png)


访问resources下的文件可以修改,不建议  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/cd74fdd8bd7649d5bd26ad7bb5957e6f.png)


访问连接



http://localhost/resp/list


后端代码



/\*\*

* 响应一个页面
* @return list页面,会在前面拼 /templates,后面拼.html
* 最终访问到xxx/templates/opus/list.html
*/
@RequestMapping(“/list”)
public String respHtml(){
return “/opus/list”;
}


### 2.响应页面,ModelAndView 且共享数据[[${usename}]]


要点:





// 1.定义要跳转的页面,2.添加要共享的数据
ModelAndView mv = new ModelAndView(“opus/list”);
mv.addObject(“username”, “peter”);


第一种方式:不建议


![在这里插入图片描述](https://img-blog.csdnimg.cn/8ba8350a3bbb442181b45e9caac5710c.png)


第二种方式:以后共享数据都用这种方式


![在这里插入图片描述](https://img-blog.csdnimg.cn/2cb353d4454146daa52ec8cd512878df.png)


共享值显示到前端


![在这里插入图片描述](https://img-blog.csdnimg.cn/f04a145d6c8b49449dce8807c06055ed.png)



@RequestMapping("/listAndData")
public ModelAndView respHtmlData(){
    // 1.定义要跳转的页面,2.添加要共享的数据
    ModelAndView mv = new ModelAndView("opus/list");
    mv.addObject("username", "peter");
    return mv;
}

### 3.如果想自己处理,就用void


要点:没有返回值,用void


![在这里插入图片描述](https://img-blog.csdnimg.cn/ccdcbf2a35214ac48edb7ad7a7a11392.png)



package com.tianju.controller;

import com.alibaba.fastjson.JSON;
import com.tianju.entity.ResData;
import com.tianju.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;

/**
* 响应相关:1.响应json;2.响应页面
* 要点:
* 1.在容器@Controller;
* 2.路径;@RequestMapping(“/resp”);
* 3.如果是响应json,需要加@ResponseBody;
* 4.如果响应页面,则返回值是string
* 补充:如果一个controller响应都是json
* 则,@RestController代替 @Controller 和 @ResponseBody
*/
@Controller
@RequestMapping(“/resp”)
//@RestController // 等价于@Controller + @ResponseBody
public class ResponseControllerDemo {
@RequestMapping(“/json”)

总结

一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。

这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。

最后再说几句关于招聘平台的,总之,简历投递给公司之前,请确认下这家公司到底咋样,先去百度了解下,别被坑了,每个平台都有一些居心不良的广告党等着你上钩,千万别上当!!!

Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
在这里插入图片描述

值是string
* 补充:如果一个controller响应都是json
* 则,@RestController代替 @Controller 和 @ResponseBody
*/
@Controller
@RequestMapping(“/resp”)
//@RestController // 等价于@Controller + @ResponseBody
public class ResponseControllerDemo {
@RequestMapping(“/json”)

总结

一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。

这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。

最后再说几句关于招聘平台的,总之,简历投递给公司之前,请确认下这家公司到底咋样,先去百度了解下,别被坑了,每个平台都有一些居心不良的广告党等着你上钩,千万别上当!!!

Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
[外链图片转存中…(img-KKpvxeyD-1714472622616)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 30
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是详细的教程: 1. 环境准备 首先,需要准备好以下环境: - IDEA 2020版本 - JDK 1.8或以上 - Maven - Tomcat 2. 创建Maven项目 打开IDEA,选择File -> New -> Project,选择Maven,在左侧选项卡选择Web Application,点击Next。在下一个页面输入Group Id和Artifact Id,然后点击Next。 在下一个页面,输入项目名称和路径,然后点击Finish。IDEA会自动创建一个Maven项目,并且生成一些基本的文件和目录结构。 3. 配置pom.xml 打开项目的pom.xml文件,添加以下依赖: ```xml <!-- Spring依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- MyBatis依赖 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis-spring.version}</version> </dependency> <!-- 数据库驱动依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- Servlet API依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servlet.version}</version> <scope>provided</scope> </dependency> <!-- JSP API依赖 --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>${jsp.version}</version> <scope>provided</scope> </dependency> <!-- JSTL依赖 --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> ``` 其,${spring.version}、${mybatis.version}、${mybatis-spring.version}、${mysql.version}、${servlet.version}和${jsp.version}都是需要在pom.xml定义的变量,例如: ```xml <properties> <spring.version>5.2.9.RELEASE</spring.version> <mybatis.version>3.5.6</mybatis.version> <mybatis-spring.version>2.0.6</mybatis-spring.version> <mysql.version>8.0.21</mysql.version> <servlet.version>3.1.0</servlet.version> <jsp.version>2.3.3</jsp.version> <jstl.version>1.2</jstl.version> </properties> ``` 4. 配置web.xml 在src/main/webapp/WEB-INF目录下创建web.xml文件,并添加以下内容: ```xml <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>SSM Maven Webapp</display-name> <!-- SpringMVC配置 --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- Spring配置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring-context.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 编码过滤器 --> <filter> <filter-name>encodingFilter</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>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- JSP和静态资源映射 --> <jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <page-encoding>UTF-8</page-encoding> </jsp-property-group> </jsp-config> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> ``` 5. 编写Spring配置文件 在src/main/resources目录下创建spring目录,并在其创建spring-context.xml和spring-mvc.xml两个配置文件spring-context.xml: ```xml <!-- 数据源配置 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean> <!-- MyBatis配置 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="typeAliasesPackage" value="com.example.demo.entity"/> <property name="mapperLocations" value="classpath:mapper/*.xml"/> </bean> <!-- Mapper扫描配置 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.demo.dao"/> </bean> ``` spring-mvc.xml: ```xml <!-- 扫描Controller --> <context:component-scan base-package="com.example.demo.controller"/> <!-- 配置视图解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 配置静态资源访问 --> <mvc:default-servlet-handler/> <!-- 配置SpringMVC注解支持 --> <mvc:annotation-driven/> ``` 6. 编写实体类和Mapper接口 在src/main/java目录下创建com.example.demo.entity和com.example.demo.dao两个包。 在com.example.demo.entity包创建一个User类,用于表示用户信息: ```java public class User { private Integer id; private String name; private Integer age; // 省略getter和setter方法 } ``` 在com.example.demo.dao包创建一个UserMapper接口,用于定义对User表的增删改查操作: ```java public interface UserMapper { List<User> listAll(); User getById(Integer id); void add(User user); void update(User user); void delete(Integer id); } ``` 7. 编写Mapper映射文件 在src/main/resources目录下创建mapper目录,并在其创建UserMapper.xml文件,用于实现UserMapper接口定义的操作: ```xml <mapper namespace="com.example.demo.dao.UserMapper"> <select id="listAll" resultType="com.example.demo.entity.User"> select * from user </select> <select id="getById" parameterType="java.lang.Integer" resultType="com.example.demo.entity.User"> select * from user where id = #{id} </select> <insert id="add" parameterType="com.example.demo.entity.User"> insert into user(name, age) values(#{name}, #{age}) </insert> <update id="update" parameterType="com.example.demo.entity.User"> update user set name = #{name}, age = #{age} where id = #{id} </update> <delete id="delete" parameterType="java.lang.Integer"> delete from user where id = #{id} </delete> </mapper> ``` 8. 编写Controller 在com.example.demo.controller包创建一个UserController类,用于处理与用户相关请求: ```java @Controller @RequestMapping("/user") public class UserController { @Autowired private UserMapper userMapper; @RequestMapping("/list") public String list(Model model) { List<User> userList = userMapper.listAll(); model.addAttribute("userList", userList); return "user/list"; } @RequestMapping("/add") public String add() { return "user/add"; } @RequestMapping("/doAdd") public String doAdd(User user) { userMapper.add(user); return "redirect:/user/list"; } @RequestMapping("/edit") public String edit(Integer id, Model model) { User user = userMapper.getById(id); model.addAttribute("user", user); return "user/edit"; } @RequestMapping("/doEdit") public String doEdit(User user) { userMapper.update(user); return "redirect:/user/list"; } @RequestMapping("/delete") public String delete(Integer id) { userMapper.delete(id); return "redirect:/user/list"; } } ``` 9. 编写JSP页面 在src/main/webapp/WEB-INF/views/user目录下创建list.jsp、add.jsp和edit.jsp三个文件,分别用于显示用户列表、添加用户和编辑用户: list.jsp: ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <title>User List</title> </head> <body> <h1>User List</h1> <table border="1"> <tr> <th>ID</th> <th>Name</th> <th>Age</th> <th>操作</th> </tr> <c:forEach items="${userList}" var="user"> <tr> <td>${user.id}</td> <td>${user.name}</td> <td>${user.age}</td> <td> <a href="${pageContext.request.contextPath}/user/edit?id=${user.id}">编辑</a> <a href="${pageContext.request.contextPath}/user/delete?id=${user.id}">删除</a> </td> </tr> </c:forEach> </table> <br/> <a href="${pageContext.request.contextPath}/user/add">添加用户</a> </body> </html> ``` add.jsp: ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Add User</title> </head> <body> <h1>Add User</h1> <form action="${pageContext.request.contextPath}/user/doAdd" method="post"> Name: <input type="text" name="name"/><br/> Age: <input type="text" name="age"/><br/> <input type="submit" value="提交"/> </form> </body> </html> ``` edit.jsp: ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Edit User</title> </head> <body> <h1>Edit User</h1> <form action="${pageContext.request.contextPath}/user/doEdit" method="post"> <input type="hidden" name="id" value="${user.id}"/> Name: <input type="text" name="name" value="${user.name}"/><br/> Age: <input type="text" name="age" value="${user.age}"/><br/> <input type="submit" value="提交"/> </form> </body> </html> ``` 10. 部署和运行 在IDEA点击菜单栏的Run -> Edit Configurations,选择Tomcat Server,点击左侧的“+”按钮,选择Local,并设置Tomcat安装目录和应用访问路径。点击OK后,就可以选择新建的配置并点击Run按钮来启动Tomcat服务器。 启动成功后,打开浏览器,访问http://localhost:8080/SSM_Maven_Webapp/user/list即可看到用户列表页面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值