最新要闻
- 277米!华为WATCH Ultimate非凡大师助力 潜水员韩颋再创亚洲洞穴潜水记录
- 不想做“四眼仔”!怎样科学使用电子产品?这4点学起来
- 环球速看:“男生减速带”视频为什么能爆红?抖音科普
- 海信手机天猫旗舰店停运:页面显示“店铺终止经营公告”-世界看点
- 沙特准备进军国际传媒业:钱不是问题要的是影响力
- 机构调研团走进集泰股份 天天热文
- 当前速看:六安市裕安区:大抓基层,带动乡村“跑”起来
- 比三星更稳、比致态便宜!西部数据SN770 2TB固态硬盘只要789元
- NVIDIA业绩不给力 黄仁勋年收入锐减!仅员工中位值的94倍 视焦点讯
- 世界微动态丨LG推出新款超宽带鱼屏:Nano IPS面板 配有雷电4
- 买菜车也疯狂!丰田卡罗拉Nightshade特别版官图发布:很酷炫
- 今日热讯:27岁未婚女子入职前被要求做孕检:她当场拒绝了
- 播报:飘飘遇仙全集狼太郎txt无删减 飘飘遇仙全集狼太郎txt
- 在街头弹钢琴的他,登上了音乐厅! 热头条
- 一口一个更好吃:德芙84g袋装小巧粒7.8元/袋大促(原价18元)
- 环球观焦点:跑步直追!比亚迪高阶智驾第三季度上车:名为DNP、汉将首搭
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Spring MVC官方文档学习笔记(一)之Web入门
注: 该章节主要为原创内容,为后续的Spring MVC内容做一个先行铺垫
1.Servlet的构建使用
(资料图)
(1) 选择Maven -> webapp来构建一个web应用
(2) 构建好后,打开pom.xml文件,一要注意打包方式为war包,二导入servlet依赖,如下
war javax.servlet javax.servlet-api 3.1.0 provided
(3) 替换webapp/WEB-INF/web.xml文件为如下内容,采用Servlet 3.1版本
(4) 在main目录下,新建java目录和resources目录,并在java目录下新建包,最终项目目录结构如下
(5) 编写一个简单的servlet如下
@WebServlet("/example")public class ExampleServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("example..."); }}
(6) 有了servlet后,我们得让服务器知道哪个请求要交给哪个servlet处理,因此还需要配置web.xml如下
exampleServlet cn.example.springmvc.boke.servlet.ExampleServlet exampleServlet /
(7) 然后,为了能够在网页上访问,我们得把这个项目部署到tomcat服务器中
首先,在URL栏中,添加上项目名称,此处为springmvc
然后,在Deployment中添加我们的项目
最后,注意 Application Context 中的值,应与前面在URL栏中添加的项目名称相同,此处均为springmvc
(8) 最后,启动tomcat服务器,在浏览器上输入 http://localhost:8080/springmvc/example ,如果能看到 example... 字符串,则说明项目配置成功
2.基于web.xml,整合Spring与Servlet
(1) 现在,web应用已经搭建好了,但是我们希望能够在该应用中使用Spring容器,该怎么办呢? 在之前的非web环境中,我们都是在main方法中创建ioc容器(如 new ClassPathXmlApplicationContext()),然后直接使用的,但是现在没有了main方法,该由谁来创建ioc容器呢? 答案就是由我们的web容器,可以在web应用初始化的时候来帮助我们创建,但创建好之后,我们该怎么获取到ioc容器呢? Servlet规定了4大作用域,分别为page域(PageContext),当前页面有效; request域(HttpServletContext),一次请求内有效; session域(HttpSession),一次会话内有效; application域(ServletContext),在当前整个web应用内有效,因此我们可以将创建好的ioc容器直接放到application域中,这样在任何位置,我们都能拿到ioc容器进行使用,具体示例如下
首先导入相关的Spring依赖包
org.springframework spring-context 5.2.22.RELEASE org.springframework spring-web 5.2.22.RELEASE
接着,修改我们的代码,配置一个普通的bean
//创建一个普通的java类public class ExampleService { public String get() { return "user"; }}//然后,在resources目录下新建一个springmvc.xml,并将上面的ExampleService注册为一个bean
接下来,我们就得让web容器来为我们创建ioc容器了,具体由谁来创建呢? Servlet有三大核心组件,即Servlet,用于处理请求;Filter,过滤器,用来拦截或修改请求;Listener,监听器,用于监听某个事件。显然,这里使用Listener最合适,那就由Listener来为我们创建ioc容器
org.springframework.web.context.ContextLoaderListener contextConfigLocation classpath:springmvc.xml exampleServlet cn.example.springmvc.boke.servlet.ExampleServlet exampleServlet /
现在ioc容器有了,而且被Spring以WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE为key放到了application域中,现在我们可以在任何地方被获取到它,如下所示
@WebServlet("/example")public class ExampleServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取application域中的ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE属性值,即我们的ioc容器 XmlWebApplicationContext ctx = (XmlWebApplicationContext) this.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); //或者也可以使用Spring提供的工具类WebApplicationContextUtils来获取ioc容器,如下 //XmlWebApplicationContext ctx = (XmlWebApplicationContext) WebApplicationContextUtils.getWebApplicationContext(this.getServletContext()); //使用ioc容器,获取其中的bean ExampleService exampleService = ctx.getBean(ExampleService.class); resp.getWriter().write(exampleService.get()); }}//最后,重新启动容器,访问 http://localhost:8080/springmvc/example,会发现页面上出现 user 字符串
当然,向上面这样每次都通过get方法获取,很麻烦,我们可以借助Spring提供的工具类,在Servlet初始化的时候对Servlet进行依赖注入,如下
@WebServlet(urlPatterns = "/example")public class ExampleServlet extends HttpServlet { //使用@Autowired注解标注需要进行依赖注入的bean @Autowired private ExampleService exampleService; //Servlet初始化方法 @Override public void init(ServletConfig config) throws ServletException { super.init(config); //获取application域 ServletContext servletContext = config.getServletContext(); //使用Spring提供的自动注入工具类SpringBeanAutowiringSupport,直接进行依赖注入 SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, servletContext); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().println(exampleService.get()); }}
3.基于Servlet扩展接口,整合Spring与Servlet
(1) 在上一节中,我们将ioc的创建配置于web.xml中,但此外我们还可以利用java代码的方式来创建ioc容器,可通过Servlet 3.0提供的ServletContainerInitializer接口,来在web容器启动的时候为第三方组件提供初始化的机会(例如注册Servlet等),如果要使用ServletContainerInitializer接口,那么就必须要在项目或所其依赖的jar包中的/META-INF/services目录下创建一个名称为javax.servlet.ServletContainerInitializer 的文件,而这个文件的具体内容,就是ServletContainerInitializer实现类的全限定类名称,然后,借助java的SPI技术,web容器便会加载这些实现类,通常情况下,ServletContainerInitializer这个接口通常会配合@HandlesTypes注解一起使用,而这个@HandlesTypes注解的作用就是让web容器收集我们项目中所有所指定的类,然后将这些类作为ServletContainerInitializer的onStartup方法参数传入,这样,在web容器启动的时候,我们就可以拿到这些我们所需的类然后创建它们
当然,同上面web.xml中的ContextLoaderListener,Spring也提供了一个ServletContainerInitializer接口的实现类SpringServletContainerInitializer,来创建帮助我们简化ioc容器的创建,首先在spring-mvc jar包中,就定义了一个/META-INF/services/javax.servlet.ServletContainerInitializer文件,然后,在启动时,web容器便会加载这个文件,读取里面的内容,为SpringServletContainerInitializer这个类
由于在SpringServletContainerInitializer上有注解@HandlesTypes标注,而这个注解的值为WebApplicationInitializer,因此,在创建SpringServletContainerInitializer对象前,web容器会收集应用内所有WebApplicationInitializer接口的实现类,并将它们作为参数传递给onStartup方法中的webAppInitializerClasses,这样,在web容器启动时,我们就能初始化我们所指定的对象
总而言之,在应用启动时,web容器会调用ServletContainerInitializer实现类(这里为SpringServletContainerInitializer)中的onStartup方法,而这个onStartup方法中又调用了@HandlesTypes注解所指定的类或接口(此处为WebApplicationInitializer)的实现类中的onStartup方法,因此,我们可以编写一个WebApplicationInitializer的实现类,来创建ioc容器,不过,Spring已经为我们提供了一个实现了WebApplicationInitializer接口的抽象类AbstractContextLoaderInitializer,它里面已经封装好了大部分的逻辑(比如将ioc容器置于application域中等),而我们所需要做的仅仅就是创建一下ioc容器而已,如下
public class IocInit extends AbstractContextLoaderInitializer { @Override protected WebApplicationContext createRootApplicationContext() { XmlWebApplicationContext ctx = new XmlWebApplicationContext(); ctx.setConfigLocation("classpath:springmvc.xml"); return ctx; }}
此外,不要忘了注释掉web.xml中关于Spring的相关内容,否则会产生产生两个ioc容器
exampleServlet cn.example.springmvc.boke.servlet.ExampleServlet exampleServlet /
最后,重启项目,输入http://localhost:8080/springmvc/example,看见user字符串则说明成功
4.Spring MVC
现在,我们将Servlet与Spring ioc容器整合到了一起,但如果我们需要处理新的请求的话,我们还得继承HttpServlet来编写新的Servlet,并将其配置到web.xml中,非常麻烦,因此,Spring变为我们提供了一个全新的框架 - Spring MVC来帮助我们进行开发
关键词:
-
当前报道:python 多进程jieba分词,高效分词,multiprocessing
自然语言任务经常使用jieba分词,数据量大时怎么加速,jieba分词不支持使用asyncio异步加速,使用multiproc
来源: Spring MVC官方文档学习笔记(一)之Web入门
当前报道:python 多进程jieba分词,高效分词,multiprocessing
277米!华为WATCH Ultimate非凡大师助力 潜水员韩颋再创亚洲洞穴潜水记录
不想做“四眼仔”!怎样科学使用电子产品?这4点学起来
环球速看:“男生减速带”视频为什么能爆红?抖音科普
海信手机天猫旗舰店停运:页面显示“店铺终止经营公告”-世界看点
沙特准备进军国际传媒业:钱不是问题要的是影响力
机构调研团走进集泰股份 天天热文
每日热闻!记录--Vue3+TS(uniapp)手撸一个聊天页面
世界时讯:ios打包ipa的四种实用方法(.app转.ipa)
全球热消息:定了!AIRIOT新品发布会,6月6日北京见。
商品日报(5月11日):沪镍跌超5%创逾一个月新低 棕榈油跌超3% 环球新视野
当前速看:六安市裕安区:大抓基层,带动乡村“跑”起来
比三星更稳、比致态便宜!西部数据SN770 2TB固态硬盘只要789元
NVIDIA业绩不给力 黄仁勋年收入锐减!仅员工中位值的94倍 视焦点讯
世界微动态丨LG推出新款超宽带鱼屏:Nano IPS面板 配有雷电4
买菜车也疯狂!丰田卡罗拉Nightshade特别版官图发布:很酷炫
今日热讯:27岁未婚女子入职前被要求做孕检:她当场拒绝了
播报:飘飘遇仙全集狼太郎txt无删减 飘飘遇仙全集狼太郎txt
构建万物互联,华为云IoT+鸿蒙重燃物体感知-全球热点评
JavaScript全解析——this指向|环球今日报
实现高并发秒杀的 7 种方式,写的太好了,建议收藏!!
译:从分布式微服务到单体
谷歌全线反击!PaLM 2部分性能已经超越GPT-4-全球今亮点
【财经分析】两只转债接连进入“下线倒计时” 市场如何接纳退市常态化? 要闻
在街头弹钢琴的他,登上了音乐厅! 热头条
一口一个更好吃:德芙84g袋装小巧粒7.8元/袋大促(原价18元)
环球观焦点:跑步直追!比亚迪高阶智驾第三季度上车:名为DNP、汉将首搭
被指滥用应用市场主导地位:苹果再次遭遇反垄断调查 焦点速看
全球观点:华为WATCH 4星球系列上演宇宙级浪漫 健康领域华为或将迎来重大突破
天舟六号货运飞船与空间站组合体完成交会对接
环球热头条丨用Python实现艺术绘画,人生苦短,代码赛高
【新华500】新华500指数(989001)11日收跌0.18%-世界微动态
世界头条:美联储高利率风险仍存在 黄金期货能否延续涨势
学生点外卖:因围墙太高 小哥摇树报送餐位置
每日快讯!来自“公路王者”的检验!蔚来ES6被两大货车夹击:框架完好人员安全
小米电视A55/A65竞技版开售:1799就能有4K/120Hz高刷大屏|天天通讯
iQOO Neo8 Pro上架:首发天玑9200+ CPU性能比骁龙8 Gen2更猛 实时焦点
微型电动车战火再起!长安Lumin周年庆至高优惠1万硬刚五菱
环球热议:如何为漆面准备金属
天天快看:有文化的网名情侣(有文化的网名)
Python工具箱系列(三十一)
天天视点!可变参数的格式化输出
利用kali破解WiFi密码_全球热消息
天天观焦点:重庆市高级人民法院依法公开宣判张波、叶诚尘故意杀人案
李想说出大实话:理想L8最大竞争对手其实是这台车
号称“不泄密” 微信键盘1.0.6发布:加入2项新功能
起售价或低于25万 凯迪拉克GT4实车曝光:家族最便宜SUV来了|世界今热点
长沙被占车位成为网红打卡地:有人两百公里外赶来直播 环球快看
省级校本教研基地工作总结(精选26篇)|世界观点
6000+字讲透ElasticSearch 索引设计
Linux系统上创建.NET6项目(通过命令行(CTL)方式)
15日起内地赴港澳签注办理更便捷 端午赴港澳机票较五一降三成|环球视点
索尼最强旗舰!Xperia 1 V发布:8999元起
4月SUV销量排名:比亚迪双星无敌!燃油车苦苦挣扎
当前视点!Linux重启Java的.sh脚本shell
stm32 boot0硬件接法导致的概率性启动失败问题总结和反思
k3s 证书过期修改
《种地吧》下期精彩:后陡门篮球赛主打团结 种地团直面成长阵痛-当前资讯
孟羽童视频回应离职格力:下一步将申请读研|环球观点
2999元!佳能发布掌上Vlog机PowerShot V10 比手机还小巧
焦点热讯:索尼放大招 Xperia 1 V用上双层晶体管传感器:画质媲美全画幅相机
天玑9200+正式发布!解决旗舰用户三大痛点 带来顶级游戏性能体验 世界新消息
黑寡妇毒杀亲夫
【天天热闻】手动挡正确停止和关闭发动机 以及关闭发动机钥匙的步骤
动力节点老杜B站Spring6学习笔记—Spring的入门程序
IOC类图
【独家】泰州姜堰:绿色能源清风吹拂一座城
环球新消息丨借鉴新加坡经验 深圳地铁拟推行早起上班优惠价:缓解早高峰拥挤
正式超越日本!一季度中国成全球第一大汽车出口国 天天速看料
三层防护 稳健医用外科口罩便宜了:3盒150只到手21.8元
全球快播:年内最大降幅?国内油价或即将大幅度下调 就在5月16日
微信开启“带货时代”:公众号今日起也能带货了
华硕笔记本A45v怎么清空所有数据?华硕笔记本a45v参数配置
电脑网页变成灰色是怎么回事?电脑网页变成灰色怎么解决?
国家移民管理局发布公告 5月15日起全面恢复口岸快捷通关|焦点消息
金立V183什么时候上市的?金立V183手机参数
宏基笔记本白屏是什么原因?宏基笔记本白屏怎么解决?
qq邮箱怎么点亮图标?qq邮箱格式怎么写?
周迅身高是多少?周迅个人资料简介
打电话不显示号码是怎么回事?打电话不显示号码怎么办?
盛夏晚晴天吻戏在哪几集?盛夏晚晴天电视剧结局是什么?
版权符号怎么打出来?版权符号html代码
吉林市为什么和省一个名字?吉林市旅游必去十大景点
世界快看:第二章、操作系统基本原理
世界最资讯丨蒙哥马利算法
每日观点:热烈欢迎成都市武侯区人社局领导莅临璞华考察参观
山西印发冬小麦后期田间管理意见
世界关注:荣盛发展年报遭问询,被追问营收大幅下滑、业绩大额亏损且亏损面进一步扩大原因及合理性
全球最大超算竞赛 现场DIY设计并攒机 北大学生拿下总冠军
美国4S店躺赢 巴菲特不爱车企爱经销商 天天速看
华为海外连开两场重磅发布会:发力全球市场势头不减! |每日视讯
太贵卖不动?NV又准备RTX 4070公版:4799元国内玩家抢吧 全球聚看点
人造肉更环保?新研究表明:对气候影响可能是普通牛肉25倍|看点
焦点快报!2023年上海市全民数字素养与技能提升月启动
Docker网络类型
Java之图片上传与删除功能的实现
用户分享 | Dockquery,一个国产数据库客户端的初体验
Django SQL注入漏洞分析(CVE-2022-28346) 全球报资讯
openAI发布v0.2.0了 全球快讯