当前位置: 首页 > news >正文

[ SpringWeb ] 搭建和配置

目录

一. 概述

(1). 问题引出:

(2). 定义:

(3). 特点:

(4). 运行流程:

(5). 组件

二. SpringWeb的搭建

(1). pom.xml 导入jar文件

(2). 在 web.xml 文件中配置 DispatcherServlet

(3). 在resources下创建spring .xml文件,并在spring .xml中 配置核心

(4)接受参数和响应数据

1. controller 层

2. model 层

3. service 层

4. dao 层(此处省略)

(5) 拦截器

1. 配置拦截器

2. 拦截器实现类


一. 概述

(1).问题引出:

之前JavaEE 开发中,web层使用的是原生的servlet(弊端:类中只提供doget和dopost方法 ; 接收参数很麻烦 (req.getparameter) ; 响应数据麻烦 ,Java对象要转为json类型)

spring中的web模块就可以解决以上存在的问题

(2). 定义:

SpringWeb 是 spring 框架中的一个模块,基于 Servlet API 构建的 web 框架.springWeb 是 专门用于开发web 应用层. 核心主要包含请求映射、控制器、参数绑定、异常处理等几个方面

(3). 特点:

 SpringWEB 是 spring 家族原生产品,与 IOC 容器等基础设施无缝对接.

 基于Servlet,提供了一个前端控制器 DispatcherServlet ,开发者无须额外开发控制器对象.

 可以自动绑定用户输入,并正确地转换数据类型.

 代码清新简洁,大幅度提升开发效率.

 内部组件化程度高,可插拔式组件即插即用.

 性能卓著,尤其适合现代大型、超大型互联网项目要求

(4). 运行流程:

(5). 组件

1. 前端控制器:DispatcherServlet(不需要程序员开发),由框架提供, 在web.xml 中配置。

作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求.

2. 处理器映射器:HandlerMapping(不需要程序员开发),由框架提供。

作用:根据请求的 url 查找 Handler(处理器/Controller)

3. 处理器适配器:HandlerAdapter(不需要程序员开发),由框架提供。

作用:按照特定规则(HandlerAdapter 要求的规则)去执行 Handler。

4. 处理器:Handler(也称之为 Controller,需要工程师开发)

作用:接受用户请求信息,调用业务方法处理请求,也称之为后端控制器

注意:编写 Handler 时按照 HandlerAdapter 的要求去做,这样适配器才可以去正确执行Handler

二. SpringWeb的搭建

搭建著名的ssm框架(原来----->现在)

s: spring----> spring

s: strust----> springweb

m: mybatis----> mybatis

停止官方下载的相关配置,之后配置华为云下载更快,删掉mov 和 jsp文件,然后用Maven刷新一下

(1). pom.xml 导入jar文件

<!--jackson 把java对象转为json字符串组件--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.14.2</version> </dependency><!--spring web模块依赖 Maven会自动将spring核心依赖下载下来--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.2.RELEASE</version> </dependency><dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency>

(2). 在 web.xml 文件中配置 DispatcherServlet

<!--配置: 注册spring中核心的DispatcherServlet-->
<servlet>
<servlet-name>application</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value><!--服务器启动时,读取spring配置文件,启动spring框架-->
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>

<!-- 请求映射 -->
<servlet-mapping>
<servlet-name>application</servlet-name>
<url-pattern>/</url-pattern><!--/ 所有的前端请求都会到达DispatcherServlet 相当于过滤器-->
</servlet-mapping>

(3). 在resources下创建spring .xml文件,并在spring .xml中 配置核心

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 配置spring对哪个包下的类进行扫描 --> <context:component-scan base-package="org.example.ssm"></context:component-scan> <!--开启spring web模块的注解--> <mvc:annotation-driven/> <!--配置拦截器--> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/><!--配置所有请求进入这个拦截器--> <mvc:exclude-mapping path="/api/loginCtl/login"/><!--配置不进入拦截器的请求地址--> <bean class="org.example.ssm.interceptor.TokenInterceptor"/><!--配置拦截器的实现类--> </mvc:interceptor> </mvc:interceptors> </beans>

(4)接受参数和响应数据

1. controller 层

四种方法

package org.example.ssm.web; import org.example.ssm.model.Admin; import org.example.ssm.model.Result; import org.example.ssm.service.LoginService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; // Controller处理器(hander) 自定义控制器 @RestController//为web层添加注解标签 让spring扫描到 @RequestMapping(path="/api/loginCtl")//映射 为类和方法配置映射的访问地址,类地址在项目中不能重复 public class LoginController { @Autowired private LoginService loginService; /* 方式4: 后端接收前端提交的json格式的数据 1.项目中需要添加json转换的组件 2.在对象前添加 @RequestBody 注解 * */ @PostMapping(path = "/login") public Result login(@RequestBody Admin admin){ System.out.println(admin); loginService.login(admin); Result result = new Result(200,"登陆成功",admin); return result; } @GetMapping (path="/test") public String test(){ System.out.println("test"); return "suc"; } //@RequestMapping 为方法定义地址时,可以指定请求的方式,方法的地址 在同一个类中不能重复 /* @RequestMapping(path="/login",method = RequestMethod.POST)// method = RequestMethod.POST指定请求方式 :只运行发送post请求*/ //@GetMapping(path = "/login") /*@PostMapping(path = "/login") //方式一: 使用HttpServletRequest对象接收请求中的数据 public String login(HttpServletRequest request){ System.out.println(request.getParameter("name")); System.out.println(request.getHeader("token")); System.out.println(request.getRemoteAddr()); return "success"; }*/ /* //方式二: @PostMapping(path = "/login") public String login(String account,String password,@RequestHeader("token") String token){ // String token的值无法拿到,需要使用@RequestHeader("token")将token的值赋给String token System.out.println(account); System.out.println(password); System.out.println(token); return "success"; }*/ /* //方式三: @PostMapping(path = "/login") public String login(@RequestParam("user-account") String account, @RequestParam("user-password")String password, @RequestHeader("user-token") String token){ // String token的值无法拿到,需要使用@RequestHeader("token")将token的值赋给String token System.out.println(account); System.out.println(password); System.out.println(token); return "success"; }*/ }

方法四: 用实体类对象接收

添加json转换组件

<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>

@RequestBody 可以接收前端提交的 json 格式数据,将 json 格式封装到对象中.

@RequestMapping("/save")

public voidsave(@RequestBodyAdminadmin){

}

2. model 层

注意: 日期类型转换

属性类型为 Date 类型需要指定转换格式

@DateTimeFormat(pattern = "yyyy-MM-dd")

private Date birthday

package org.example.ssm.model; import com.fasterxml.jackson.annotation.JsonFormat; import org.springframework.context.annotation.Scope; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.stereotype.Component; import java.util.Date; @Component @Scope(value="prototype") public class Admin { private int id ; private String account; private String password; @DateTimeFormat(pattern ="yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") private Date birthday;//数据会自动格式转换 private int age; @Override public String toString() { return "Admin{" + "id=" + id + ", account='" + account + '\'' + ", password='" + password + '\'' + ", birthday=" + birthday + ", age=" + age + '}'; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
package org.example.ssm.model; public class Result { private int code;//响应的状态码 自己程序中定义的状态码 private String message;//消息 private Object data; //数据 //创建有参的构造方法 public Result(int code, String message, Object data) { this.code = code; this.message = message; this.data = data; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } }
3. service 层
package org.example.ssm.service; import org.example.ssm.model.Admin; import org.springframework.stereotype.Service; @Service public class LoginService { public void login(Admin admin){ System.out.println("service"+admin); } }
4. dao 层(此处省略)

(5) 拦截器

1. 配置拦截器
<!--配置拦截器--> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/><!--配置所有请求进入这个拦截器--> <mvc:exclude-mapping path="/api/loginCtl/login"/><!--配置不进入拦截器的请求地址--> <bean class="org.example.ssm.interceptor.TokenInterceptor"/><!--配置拦截器的实现类--> </mvc:interceptor> </mvc:interceptors>
2. 拦截器实现类
package org.example.ssm.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //拦截器 public class TokenInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token =request.getHeader("token"); System.out.println("token 认证拦截器:"+token); if(token.equals("123456")){//认证token return true;//离开拦截器,继续向后到达自定义处理器 }else { response.setContentType("text/html;charset=utf-8"); response.getWriter().write(401); return false;//不继续向后执行 } } }

注意:

过滤器 是在请求进入servelet之前

拦截器 是在请求进入到自定义处理器时进行拦截 (如上述流程图所示)

http://www.jsqmd.com/news/1406005/

相关文章:

  • Dell G15散热控制实战:用开源TCC替代AWCC的完整指南
  • ControlNet v1.1 FP16实战手册:3个案例教你精准控图,从此告别废图
  • HsMod插件上手指南:8个实用技巧让炉石传说体验全面升级
  • 2026年8月泉州防水补漏瓷砖空鼓实测|同城建筑修缮上门施工服务体验 - 超人防水
  • 2026年8月南京栖霞区电动车补胎维修实测|同城上门救援本地门店体验 - 超人防水
  • 浏览器里画矢量图总是折腾?SVG-Edit 让你免安装直接用
  • 如何零成本解锁WeMod Pro高级功能:3分钟极速体验完整权限的终极指南
  • SRWE窗口编辑器:从零玩转实时窗口调整与热采样截图的完整指南
  • 实测8款AI论文生成工具后,我发现90%的人都用错了
  • Apollo Save Tool 完整教程:3 步搞定 PS4 存档备份与转移,新手也能快速上手
  • 2026博士论文文献评述升级,体现自主学术观点 - 艾德思Editsprings
  • 广州上门回收空调提前准备工作全指南:高效完成交易的前置事项与避坑要点 - GZ小陈
  • 绕开笨重模拟器:APK安装器让Windows直装安卓应用的完整上手指南
  • 2026年8月南京栖霞区电动车补胎换胎实测|同城附近上门维修服务测评 - 超人防水
  • 别再手动改字节了:Harepacker-resurrected 让 MapleStory 地图与 WZ 资源编辑像搭积木一样简单
  • 从零构建编码智能体:Muse Glimmer-30B在SWE-Bench实战中的应用
  • 2026珠海房屋漏水维修避坑指南|正规修缮与乱象对比,少花冤枉钱 - 筑宅安
  • 零成本打造虚拟背景:OBS背景移除插件obs-backgroundremoval完整实战教程
  • 自托管服务实战(9):自建媒体与下载服务
  • 告别屏幕发白:三步用G-Helper一键修复ROG笔记本色彩配置文件丢失
  • 原神自动化工具BetterGI怎么用?把重复点击交给AI,每天省下半小时
  • 想画矢量图又不想装软件?SVG-Edit 六步上手完全指南
  • 为什么选择 AXPhotoViewer:iOS 照片查看器开源库的 6 大核心优势
  • 2026博士论文文献深挖辅导,丰富研究理论支撑 - 艾德思Editsprings
  • 2026年合肥哪有单招复读班可以报名?联系方式多少? - 最新资讯
  • 从“想要伴奏“到“写出伴奏“:Audacity 本地 AI 音频套件完整上手手册
  • **山西当地报团旅游|2026山西口碑最好的旅行社游客实测攻略** - 跟我去旅游
  • 还在对着GitHub英文界面发呆?中文化插件让仓库、议题、拉取请求全都说中文
  • 免费解锁Wand专业版还能远程控制?Wand-Enhancer 开源增强工具一步到位
  • 当游戏资源被锁进.wz文件,你需要一把顺手的钥匙