2026/6/1 19:59:20
网站建设
项目流程
怎么进入官方网站查询,广西建设网官网培训中心,免费快速建站网站,怎样做网站的ico图片三层架构与MVC 在 B/S #xff08;浏览器 / 服务器#xff09;架构的程序开发中#xff0c;常采用三层架构作为设计模式#xff0c;三层架构从用户交互到数据存储#xff0c;自上而下分为表现层、业务逻辑层、数据访问层#xff0c;每层仅负责特定职责#xff0c;且通过…三层架构与MVC在 B/S 浏览器 / 服务器架构的程序开发中常采用三层架构作为设计模式三层架构从用户交互到数据存储自上而下分为表现层、业务逻辑层、数据访问层每层仅负责特定职责且通过接口 / 数据模型通信不直接渗透其他层的内部实现。表现层接收前端请求解析参数调用业务逻辑层处理最终返回响应结果一般会采用MVC的设计模型业务层封装核心业务逻辑实现复杂业务处理持久层负责与数据库交互执行 CRUD操作不包含业务逻辑。MVC模型MVCModel-View-Controller是一种软件架构模式核心思想是通过 “关注点分离” 将应用程序的三大核心职责拆分为三个独立组件以提升代码的可维护性、可复用性和可扩展性。MVC 的三大核心组件Model数据模型Model 是应用程序的数据与业务逻辑核心封装应用程序数据即JavaBeanView视图View 是应用程序的界面展示层负责负责数据渲染同时接收用户的输入操作但不处理业务逻辑Controller控制器Controller 是 Model 与 View 之间的中间协调者控制器处理用户请求并将其传递给视图进行渲染。SpringMVC的入门案例创建 MavenJavaWeb 工程在 pom 文件中引入开发的jar包具体的坐标如下properties spring.version5.0.2.RELEASE/spring.version /properties dependencies dependency groupIdjunit/groupId artifactIdjunit/artifactId version4.13.1/version scopetest/scope /dependency dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version${spring.version}/version /dependency dependency groupIdorg.springframework/groupId artifactIdspring-web/artifactId version${spring.version}/version /dependency dependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version${spring.version}/version /dependency dependency groupIdjavax.servlet/groupId artifactIdservlet-api/artifactId version2.5/version scopeprovided/scope /dependency dependency groupIdjavax.servlet.jsp/groupId artifactIdjsp-api/artifactId version2.0/version scopeprovided/scope /dependency /dependencies编写index.jsp页面% page contentTypetext/html;charsetUTF-8 languagejava % html head title入门程序/title /head body %--超链接--% h3入门/h3 a href/hello.do 入门程序/a /body /html编写suc.jsp页面路径为/WEB-INF/pages/suc.jsp% page contentTypetext/html;charsetUTF-8 languagejava % html head title成功/title /head body h3入门成功了.../h3 /body /html/** * 控制器类处理用户的请求 */ Controller public class HelloController { RequestMapping(path /hello.do) public String sayHello(){ System.out.println(入门方法执行了2...); // 跳转的JSP页面的路径默认使用的是请求的转发 //return /WEB-INF/pages/suc.jsp; // 配置了视图解析器后写法 return suc; } }在web.xml配置文件中配置DispatcherServlet核心的控制器初始化 MVC 的核心控制器、配置文件位置和启动时机确保请求能被 SpringMVC 接管并按流程处理CharacterEncodingFilter配置解决了中文乱码这一常见问题保证请求参数和响应内容的中文正常显示。!--配置前端控制器-- servlet servlet-namedispatcherServlet/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class !--加载springmvc.xml配置文件配置的是Spring配置-- init-param param-namecontextConfigLocation/param-name param-valueclasspath:springmvc.xml/param-value /init-param !--配置启动加载-- load-on-startup1/load-on-startup /servlet servlet-mapping servlet-namedispatcherServlet/servlet-name url-pattern//url-pattern /servlet-mapping !-- 配置过滤器解决中文乱码的问题 -- filter filter-namecharacterEncodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class !-- 指定字符集 -- init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter filter-mapping filter-namecharacterEncodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping /web-app编写springmvc.xml的配置文件?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:mvchttp://www.springframework.org/schema/mvc xmlns:contexthttp://www.springframework.org/schema/context xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd !-- 配置spring创建容器时要扫描的包 -- context:component-scan base-packagecom.qcby/context:component-scan !-- 配置视图解析器 -- bean idviewResolver classorg.springframework.web.servlet.view.InternalResourceViewResolver property nameprefix value/WEB-INF/pages//property property namesuffix value.jsp/property /bean !-- 配置spring开启注解mvc的支持-- mvc:annotation-driven/mvc:annotation-driven /beansSpringMVC 核心组件前端控制器DispatcherServlet处理器映射器HandlerMapping处理器Handler处理器适配器HandlAdapter视图解析器View Resolver视图View过程图解详细流程描述用户在浏览器输入http://localhost:8080/hello.doHTTP 请求被发送到服务器服务器根据 web.xml中DispatcherServlet的映射规则将请求转发给DispatcherServlet。DispatcherServlet接收到请求后首先调用 HandlerMapping再调用 HandlerAdapter 适配 HandlerHandlerAdapter 会根据请求参数名与方法参数名的对应关系自动完成参数的类型转换和赋值最终将转换后的数据传递给控制器方法执行核心业务逻辑DispatcherServlet此时需要确定用哪个视图渲染数据因此调用ViewResolver视图解析器。ViewResolver根据预设的视图解析规则将ModelAndView中的逻辑视图名解析为物理视图路径并创建对应的View对象。DispatcherServlet获取View对象后将Model中的数据传递给View由View执行数据渲染View渲染完成后生成 HTTP 响应并将响应结果返回给DispatcherServlet。若为异步请求如ResponseBody则Handler直接返回 JSON 数据跳过ViewResolver和View渲染步骤由HandlerAdapter直接将数据转为 JSON 响应。DispatcherServlet将最终的响应通过服务器返回给客户端用户看到登录成功页面流程结束。RequestMapping注解RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系RequestMapping注解可以作用在方法和类上作用在类上第一级的访问目录作用在方法上第二级的访问目录细节路径可以不编写 / 表示应用的根目录开始RequestMapping的属性path指定请求路径的url需要显式声明键不能省略valuevalue属性和path属性是一样的当只有这一个参数时可以省略value键method指定允许的HTTP请求方式params限制请求必须包含指定的参数/** * 角色模块的类 */ Controller RequestMapping(path /role) public class RoleController { RequestMapping(path /save.do,method {RequestMethod.GET},params username) public String save(){ System.out.println(保存角色...); return suc; } RequestMapping(value /delete.do) public String delete(){ System.out.println(删除角色...); return suc; } }请求参数的绑定请求参数绑定是指框架自动将客户端发送的请求参数转换为控制器方法参数的过程。这一机制简化了开发者获取请求数据的操作无需手动解析请求参数。简单类型绑定表单提交的数据都是 kv 格式提交表单的name和JavaBean中的属性名称需要一致基本类型不能接收null值若参数可能缺失建议使用包装类对象绑定当请求参数较多时可将参数封装到 Java 对象中SpringMVC 会自动将请求参数绑定到 Java 对象的属性上要求请求参数名与 Java 对象的属性名一致属性需提供getter/setter方法嵌套绑定若 Java 对象中包含其他 Java 对象属性嵌套关系请求参数名需以 外层属性名.内层属性名 的格式传递集合类型绑定对于List、Map等集合类型通常需要将集合封装到一个包装类中请求参数名需包含集合的索引或键日期类型绑定SpringMVC 默认支持 yyyy/MM/dd 格式的日期字符串转换为Date类型英文状态时间但对 yyyy-MM-dd 等格式不支持需自定义类型转换器。代码示例前端jsp代码% page contentTypetext/html;charsetUTF-8 languagejava % html head title请求参数绑定/title /head body h3请求参数绑定简单类型绑定/h3 form action/user/save1.do methodpost 姓名input typetext nameusername /br/ 年龄input typetext nameage /br/ input typesubmit value提交 /br/ /form h3请求参数绑定封装到实体类/h3 form action/user/save2.do methodpost 姓名input typetext nameusername /br/ 年龄input typetext nameage /br/ input typesubmit value提交 /br/ /form h3请求参数绑定封装到实体类包含嵌套/h3 form action/user/save3.do methodpost 姓名input typetext nameusername /br/ 年龄input typetext nameage /br/ 金额input typetext nameaccount.money /br/ input typesubmit value提交 /br/ /form h3请求参数绑定封装到实体类存在list集合/h3 form action/user/save4.do methodpost 姓名input typetext nameusername /br/ 年龄input typetext nameage /br/ 生日input typetext namebirthday /br/ List集合br/ 金额1input typetext namelist[0].money /br/ 金额2input typetext namelist[1].money /br/ input typesubmit value提交 /br/ /form h3请求参数绑定封装到实体类存在Map集合/h3 form action/user/save5.do methodpost 姓名input typetext nameusername /br/ 年龄input typetext nameage /br/ 生日input typetext namebirthday /br/ Map集合br/ 性别input typetext idname nameinfoMap.genderbr 住址input typetext idage nameinfoMap.addressbr input typesubmit value提交 /br/ /form /body /htmlJavabean代码public class User implements Serializable{ private String username; private Integer age; // 2000-11-11 格式的日期 //DateTimeFormat(pattern yyyy-MM-dd) private Date birthday; //引用对象 private Account account; //list集合 private ListAccount list; // 添加Map集合属性 private MapString, Object infoMap new HashMapString, Object(); public User(String username, Integer age, Date birthday, Account account, ListAccount list, MapString, Object infoMap) { this.username username; this.age age; this.birthday birthday; this.account account; this.list list; this.infoMap infoMap; } public User() { } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday birthday; } public String getUsername() { return username; } public void setUsername(String username) { this.username username; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age age; } public Account getAccount() { return account; } public void setAccount(Account account) { this.account account; } public ListAccount getList() { return list; } public void setList(ListAccount list) { this.list list; } public MapString, Object getInfoMap() { return infoMap; } public void setInfoMap(MapString, Object infoMap) { this.infoMap infoMap; } Override public String toString() { SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd); String birthdayStr (birthday ! null) ? sdf.format(birthday) : null; Override public String toString() { SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd); String birthdayStr (birthday ! null) ? sdf.format(birthday) : null; return User{ username username \ , age age , birthday birthdayStr , account account , list list , infoMap infoMap }; } }由于 birthday 是 java.util.Date 类型当它被拼接到字符串中时会自动调用 Date.toString()而该方法的默认格式是固定的如Wed Apr 30 00:00:00 CST 2025要让birthday以 2025-04-30 的格式输出需要在User类的 toString() 方法中对Date对象进行手动格式化Java 8 的 DateTimeFormatter 或传统的 SimpleDateFormat。public class Account implements Serializable { // 金额 private Double money; public Account(Double money) { this.money money; } public Account() { } public Double getMoney() { return money; } public void setMoney(Double money) { this.money money; } Override public String toString() { return Account{ money money }; } }controller代码/** * 用户的模块 */ Controller RequestMapping(/user) public class UserController { /** * 请求参数的绑定 */ RequestMapping(/save1.do) public String save(String username,Integer age){ System.out.println(姓名username); System.out.println(年龄age); return suc; } /** * 请求参数的绑定 */ RequestMapping(/save2.do) public String save2(User user){ System.out.println(user对象user); return suc; } /** * 请求参数的绑定 */ RequestMapping(/save3.do) public String save3(User user){ System.out.println(user对象user); return suc; } /** * 请求参数的绑定 */ RequestMapping(/save4.do) public String save4(User user){ System.out.println(user对象user); return suc; } /** * 将请求参数封装到Map使用RequestParam注解 * 将请求参数转换为Map类型 */ PostMapping(/save5.do) public String processMap(RequestParam MapString, String map) { // 接收到的Map参数通过entrySet方法遍历并获取键值对 for (Map.EntryString, String entry : map.entrySet()) { System.out.println(entry.getKey() : entry.getValue()); } return suc; } }RequestParam Map map 的作用是将前端提交的所有请求参数直接以字符串键值对的形式存入 Map 中前端提交的日期参数本身就是字符串类型RequestParam 会原封不动地将这个字符串存入 map 的 value 中当打印 map 中的值时本质上是打印这个原始字符串因此格式就是前端提交时的格式。自定义类型转换器第一种方式使用DateTimeFormat注解的方式 DateTimeFormat(pattern yyyy-MM-dd)第二种方式自定义类型转换器需要实现Converter的接口// 使用Spring提供的Converter接口 public class StringToDate implements ConverterString, Date { Override public Date convert(String source) { if (source null || source.trim().isEmpty()) { return null; } try { // 支持yyyy-MM-dd格式的日期转换 return new SimpleDateFormat(yyyy-MM-dd).parse(source); } catch (ParseException e) { throw new IllegalArgumentException(无效的日期格式请使用yyyy-MM-dd格式, e); } } }这段代码是一个自定义类型转换器用于将字符串String类型转换为日期Date类型实现数据绑定过程中的自动类型转换。类定义 public class StringToDate implements Converter 实现了 Spring 框架提供的 Converter 接口泛型接口其中 S源类型为 String 表示需要转换的原始数据类型是字符串T目标类型为 Date 表示转换后的目标类型是 java.util.Date日期对象实现该接口后Spring 会将其识别为一个类型转换器在需要将字符串转为日期时自动调用。该类的核心方法 convert(String source) 是转换逻辑的核心使用 SimpleDateFormat 以固定格式 yyyy-MM-dd 解析字符串将其转换为Date对象。前端提交的时间字符串内容会被 Spring 通过配置的 StringToDate 转换器转换为 Date 对象java.util.Date 类型Date 对象本身不存储格式只存储一个时间戳当打印 Date 对象时会默认调用其 toString() 方法。注册自定义类型转换器在 springmvc.xml 配置文件中编写配置!--配置日期类型转换器类型转换器的组件把日期类型转换注入到组件对象中-- bean idconversionService classorg.springframework.context.support.ConversionServiceFactoryBean property nameconverters set bean classcom.qcby.util.StringToDate / /set /property /bean !-- 配置spring开启注解mvc的支持让映射器、适配器和处理器生效-- mvc:annotation-driven conversion-serviceconversionService/定义了一个 Spring Beanid 为 conversionService其类型是 ConversionServiceFactoryBean是 Spring 提供的工厂类这个工厂类的核心功能是创建并初始化 Spring 的类型转换服务核心接口 ConversionService 实例。ConversionService 负责管理所有注册的转换器实现不同类型之间的自动转换。 为 ConversionServiceFactoryBean 设置 converters 属性用于指定需要注册的转换器集合。补充在控制器中使用原生的ServletAPI对象h3请求参数绑定Servlet原生API/h3 form action/user/save6.do methodpost 姓名input typetext nameusername /br/ 年龄input typetext nameage /br/ 生日input typetext namebirthday placeholderyyyy-MM-dd /br/ !-- 示例输入2000-01-01 -- input typesubmit value提交 /br/ /form/** * Servlet原生API的使用 * param request 请求对象 * param response 响应对象 */ RequestMapping(/save6.do) public String save6(HttpServletRequest request, HttpServletResponse response,User user) { System.out.println(请求对象: request); HttpSession session request.getSession(); System.out.println(会话对象: session); System.out.println(响应对象: response); System.out.println(绑定后的User: user); return suc; }HttpServletRequest request 是 Java EE 中的请求对象封装了客户端发送的所有请求信息通过 request.getParameter(uname) 获取名为uname的请求参数通过request.getSession()获取当前会话对象HttpSessionHttpServletResponse response 是 Java EE 中的响应对象用于向客户端发送响应数据response.getWriter().print(xxx) 向客户端返回数据。实现功能的后端打印结果