一些三层架构的介绍,我就不谈了
1、SpringMVC 和 Struts2 的优劣分析
⛳️共同点:
他们都是表现层框架,都是基于MVC模型编写的。
他们的底层都离不开原始的 ServletAPI
他们处理请求的机制都是一个核心控制器
⛳️区别:
Spring MVC 的入口是 Servlet ,而 Struts2 是 Filiter
Spring MVC 的基于方法设计的,而 Struts2 是基于类, Struts2 每次执行都会创建一个动作类。 所以 Spring MVC 会稍微比 Struts2 快些
Spring MVC 使用更加简洁,同时还支持 JSR303,处理 ajax 的请求更方便
(JSR 303 是一套 JavaBean 参数校验标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们 JavaBean 的属性上面,就可以在需要验证的时候进行校验)
Struts2 的OGNL 的表达式使页面开发效率相比 Spring MVC 更高些,但执行效率并没有 JSTL 提升,尤其是 struts2 的表单标签,远没有 html 执行效率高
2、搭建 SpringMVC 项目
配置pom.xml
<properties>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
配置 web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 配置前端控制器 -->
<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:springmvc.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>
</web-app>
在 resources 包里创建 springmvc.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
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 开启注解扫描 -->
<context:component-scan base-package="cn.itcast"/>
<!-- 视图解析器 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 开启 SpringMVC 框架注解的支持 -->
<mvc:annotation-driven/>
</beans>
写 HelloController类
package cn.itcast.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @Author: Array
* @Date: 2020/5/13 15:27
*/
@Controller
public class HelloController {
@RequestMapping(path = "/hello")
public String sayHello(){
System.out.println("hello StringMVC");
return null;
}
}
3、配置完之后,运行
服务器一打开,我们先是进入到 webapp 下面的 index.jsp 里, 我们的 a 标签 指向 /hello 通过我们的 web.xml 的配置 找到 注解过@Controller 的 HelloController 控制器类 里的 @RequestMapping(path = “/hello”) 终端先输出一句我们写的 System.out 在 return “success”; 再通过视图解析器 ⬇️
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
找到 /WEB-INF/pages/ 下面的 jsp 文件,因为返回的是 success 所以找的是 /WEB-INF/pages/success.jsp ✴️ 完美 🥀 入门
4、📕 详解
1、启动服务器,加载一些配置文件
DispatcherServlet 对象创建
springmvc.xml 被加载
HelloController 对象被创建
2、发送请求后台处理请求
➡️ DispatcherServlet
控制作用,控制中心
⬇️ ↖️
⬇️ ↖️
⬇️ ↖️ RequestMapping(path = “/hello”)
success.jsp
👉 结果
@RequestMapping
参数:
value: 指定位置
path: 指定位置
method : 提交方式, method = {RequestMethod.POST} 这样的话,提交必须为post,否则不进类
params: 参数,需要提交大阔里相对的参数,才能进这个方法,如果参数后面跟了值,这时候也必须要一样才行
SpringMVC会自动帮我们封装数据,只需要前端name 的值与 封装属性一直,就会帮我们自动封装
自定义转换器
<!-- 配置自定义类型转换器 -->
<bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters" >
<set>
<bean class="cn.itcast.utils.ToDateConverter"/>
</set>
</property>
</bean>
<!-- 开启 SpringMVC 框架注解的支持 -->
<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
别忘了在 SpringMVC 框架注解支持那 加 conversion-service="conversionServiceFactoryBean"
还可以获取元素的 Servlet
public String testServlet(HttpServletRequest request, HttpServletResponse response){
return "success";
}
⛈@RequestBody
获取主体,后面ajax有用
@RequestMapping(value = "/testRequestBody")
public String testRequestBody(@RequestBody String body){
System.out.println("执行了... "+body);
return "success";
}
⛈@PathVariable
restful 编程风格
@RequestMapping(value = "/testPathVariable/{sid}")
public String testPathVariable(@PathVariable(name = "sid") String id){
System.out.println("执行了... "+id);
return "success";
}
前端字需要 就可以了
吧 {sid} 占位符 里的值 拿给 id 输出出来
⛈@RequestHeader
获取头部信息
@RequestMapping(value = "/RequestHeader")
public String testRequestHeader(@RequestHeader(value = "Accept") String header){
System.out.println("执行了... "+header);
return "success";
}
⛈@CookieValue
获取 Cookie值
@RequestMapping(value = "/testCookieValue")
public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookieValue){
System.out.println("执行了... "+cookieValue);
return "success";
}
⛈@ModelAttribute
@RequestMapping(value = "/testModelAttribyute")
public String testModelAttribyute(){
System.out.println("执行了... ");
return "success";
}
@ModelAttribute
public void showUser(){
System.out.println("优先执行.....");
}
此注解写在方法上,调用后,会优先执行此方法, 应用场景:当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用默认数据
第一种写法
@RequestMapping(value = "/testModelAttribyute")
public String testModelAttribyute(User user){
System.out.println("执行了... ");
System.out.println(user);
return "success";
}
@ModelAttribute
public User showUser(String uname){
System.out.println("showUser 执行了.....");
// 通过用户名查询数据库()
User user = new User();
user.setUname(uname);
user.setAge(20);
user.setDate(new Date());
return user;
}
第二种写法
@RequestMapping(value = "/testModelAttribyute")
public String testModelAttribyute(@ModelAttribute(value = "abc") User user){
System.out.println("执行了... ");
System.out.println(user);
return "success";
}
@ModelAttribute
public void showUser(String uname, Map<String,User> map){
System.out.println("showUser 执行了.....");
// 通过用户名查询数据库()
User user = new User();
user.setUname(uname);
user.setAge(20);
user.setDate(new Date());
map.put("abc",user);
}
⛈ @SessionAttribute
用于多次执行控制器方法间的参数共享。
要在类上面加这个 @SessionAttributes(value = {“msg”}) 相当于 把msg放到session域中
@RequestMapping(value = "/testSessionAttributes")
public String testSessionAttributes(Model model){
System.out.println("testSessionAttributes... ");
model.addAttribute("msg","美美");
return "success";
}
@RequestMapping(value = "/getSessionAttributes")
public String getSessionAttributes(ModelMap modelMap){
System.out.println("getSessionAttributes... ");
String msg = (String)modelMap.get("msg");
System.out.println(msg);
return "success";
}
@RequestMapping(value = "/deleteSessionAttributes")
public String deleteSessionAttributes(SessionStatus status){
System.out.println("getSessionAttributes... ");
status.setComplete();
return "success";
}
第一个是测试,第二个是放进session域中,并取值,第三个是删除
转载:https://blog.csdn.net/qq_39550368/article/details/106161663