当前位置: 首页 > 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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttps://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 {@Autowiredprivate 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 tokenSystem.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 tokenSystem.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 void save(@RequestBody Admin admin){

}

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;@Overridepublic 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 {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token =request.getHeader("token");System.out.println("token 认证拦截器:"+token);if(token.equals("123456")){//认证tokenreturn true;//离开拦截器,继续向后到达自定义处理器}else {response.setContentType("text/html;charset=utf-8");response.getWriter().write(401);return false;//不继续向后执行}}
}

注意: 

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

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

http://www.dtcms.com/a/446061.html

相关文章:

  • 高层次综合hls设计第一章
  • Docker 启动 Easysearch 时自定义初始密码的几种方式
  • 15.C++三大重要特性之继承
  • AI 训练大显存配置实战:24G 显存(RTX 4090)如何配 32G 内存?—— 从 “显存挪用” 到 “效率翻倍”
  • JVM即时编译
  • 【JVM】——结构组成和垃圾回收
  • 建站模板推荐设计公司的企业使命
  • php网站怎么做百度做网站不给FTP密码
  • 自由学习记录(105)
  • 聚类之KMeans
  • 汽车企业管理系统自己的网站怎么做关键词优化
  • 大模型落地的四大核心引擎:从技术突破到产业重构
  • find 命令使用介绍
  • 蓝桥杯Python备考全攻略:从入门到精通
  • 数据结构初阶(第六讲)单链表的功能实现
  • 做付费推广哪个网站好工作室网页模板
  • 合川网站建设天津自助建站
  • 元模型训练中平衡历史数据与实时市场变化的关系
  • 新手直播冷场难破?场景模拟工具解决测试与练手难题
  • 半球陀螺仪吸气剂热激活真空共晶炉
  • C++多态特性详解
  • 嵌入式第六十七天(SPI子系统架构)
  • MVC 视图
  • 公司网站运营方案东莞市建设工程检测中心网站
  • 从 C 到 C++:用 C 语言思维理解面向对象四大特性
  • SOFA 架构--02--核心中间件与工具
  • 如何利用淘宝建设网站挣钱在线注册个体工商户
  • 近世代数(抽象代数)详细笔记--域
  • 计算机网络第四章(5)——网络层《路由协议+路由协议》
  • KingbaseES在Alibaba Cloud Linux 3 的深度体验,从部署到性能实战