Spring之Web
Javaweb三大组件和四大域
顺便:Javaweb中的四大域,作用范围如下:PageContext<Request<Session<ServletContext(Application)
域对象 | 属性的作用范围 |
---|---|
PageContext | 仅限于当前jsp页面,在servlet中无法获取该对象 |
Request | 仅限于同一个请求,主要用于请求转发,服务器跳转有效,客户端跳转无效 |
Session | 仅限于一次会话,从浏览器打开直到关闭称为一次会话,搭配cookie使用 |
Application | 限于当前Web应用,是范围最大的属性作用范围,只要在一处设置属性,在其他各处的jsp或servlet中都可以获取到,在servlet中对应于ServletContext对象 |
Spring-Web实现
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//创建Spring容器
UserService userService = (UserService) applicationContext.getBean("userService");//获取Bean
User user = userService.login("zhangsan", "123");
System.out.println(user);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
}
正常实现的话需要在对应业务的文件中先创建Spring容器,然后再获取对应的Bean对象,业务代码重复。实际上创建容器的过程可以在程序开始执行的时候创建一个单例对象,之后再次使用时只要拿到这个对象直接使用即可,具体实现可以在ServletContext
监听器中实现。
-
Spring整合Servlet:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <!--web.xml文件--> <web-app> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!--指定加载的配置文件--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--监听器--> </web-app>
然后将Servlet文件中的内容更改为:
@WebServlet("/loginServlet") public class LoginServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext servletContext = req.getServletContext(); WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);//Spring容器 UserService userService = (UserService) webApplicationContext.getBean("userService");//获取Bean User user = userService.login("zhangsan", "123"); System.out.println(user); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } }
整合Web的痛点
传统的MVC+三层架构:
原始Javaweb开发中,Servlet充当Controller的角色, Jsp充当View角色, JavaBean充当模型角色,后期Ajax异
步流行后,在加上现在前后端分离开发模式成熟后, View就被原始HtmI+ Vue替代。原始Javaweb开发中,
Servlet充当Controller有很多弊端,显而易见的有如下几个:
利用一个Servlet负责共有行为,JavaBean负责对应的业务行为:
负责共有行为的Servlet称为前端控制器,应具有以下作用:
- 具备可以映射到业务Bean的能力
- 具备可以解析请求参数、封装实体等共有功能
- 具备响应视图及响应其他数据的功能
SpringMVC
- 配置过程

<!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>
<servlet>
<!--前端控制器DispatchServlet-->
<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_mvc.xml</param-value>
</init-param> <!--加载的配置文件-->
<load-on-startup>2</load-on-startup>
<!--启动时加载 大于0生效,数字越小优先级越高-->
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://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/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.azy.web.controller"/>
<!--交给Spring容器-->
</beans>
@Controller
public class UserController {
@RequestMapping("/show")
public String show(){
System.out.println("show ...");
return "index.jsp"
}
}
-
SpringMVC的工作原理
- 客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配
DispatcherServlet
的请求映射路径(在web.xml
中指定),web容器将请求转交给DispatcherServlet
. DipatcherServlet
接收到这个请求之后将根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)以及HandlerMapping
的配置找到处理请求的处理器(Handler
)DispatcherServlet
根据HandlerMapping
找到对应的Handler
,将处理权交给Handler
(Handler
将具体的处理进行封装),再由具体的HandlerAdapter
对Handler
进行具体的调用。Handler
对数据处理完成以后将返回一个ModelAndView
对象给DispatcherServlet
。Handler
返回的ModelAndView
是一个逻辑视图并不是一个正式的视图,DispatcherSevlet
通过ViewResolver
将逻辑视图转化为真正的视图View。Dispatcher
通过model解析出ModelAndView
中的参数进行解析最终展现出完整的view并返回给客户端。
- 客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配
在文件DispatcherServlet.properties
中包含默认的各部分组件:
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,\
org.springframework.web.servlet.function.support.RouterFunctionMapping
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter,\
org.springframework.web.servlet.function.support.HandlerFunctionAdapter
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
可以自定义各个组件,在spring_mvc.xml
文件中进行配置即可:
<context:component-scan base-package="com.azy.web.controller"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.
RequestMappingHandlerAdapter"> <!--配置HandlerAdapter-->
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.
MappingJackson2HttpMessageConverter"/>
</list><!--注入JSON数据转换为实体类的转换器-->
</property>
</bean>
配置好JSON转换器后,在使用JSON数据传输时就可以自动转换为实体类对象。
Spring整合SpringMVC
- 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>
<!--Spring加载-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<!--前端控制器DispatchServlet-->
<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_mvc.xml</param-value>
</init-param> <!--加载的配置文件-->
<load-on-startup>2</load-on-startup>
<!--启动时加载 大于0生效,数字越小优先级越高-->
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
<!--spring_mvc.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://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/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.azy.web.controller"/>
<!--交给Spring容器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.
RequestMappingHandlerAdapter"> <!--配置HandlerAdapter-->
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.
MappingJackson2HttpMessageConverter"/>
</list><!--注入JSON数据转换为实体类的转换器-->
</property>
</bean>
</beans>
<!--applicationContext.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://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/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.azy.web.service"/>
</beans>
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/show")
public String show(@RequestBody User user){//JSON可以自动转换
System.out.println(user);
return "/index.jsp";
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!