Spring搭建Web应用(MVC)起步(Tomcat环境)

2023-11-01

Spring搭建Web应用(MVC)起步(Tomcat环境)

 
首先,建立WEB应用的目录,必须的。
           在tomcat的webapp目录下,创建目录“spring”,目录结构如下:
          
           spring
           ----WEB-INF
                   ----classes
                   ----lib

然后,肯定是搞web.xml了,创建一个web.xml在WEB-INF目录下。
随便去网上哪里找个web.xml模板,改改就行,如下:

[web.xml start]
<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee    
       http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
      
       <servlet>
               <servlet-name>Dispatcher</servlet-name>
               <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
               <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>/WEB-INF/config.xml</param-value>
               </init-param>
               <load-on-startup>1</load-on-startup>
       </servlet>

       <servlet-mapping>
               <servlet-name>Dispatcher</servlet-name>
               <url-pattern>*.do</url-pattern>
       </servlet-mapping>


     <welcome-file-list>
           <welcome-file>index.jsp</welcome-file>
       </welcome-file-list>
      
</web-app>        
[web.xml end]
以上面的web.xml为例,首先,我们要配一个 <welcome-file>index.jsp</welcome-file>
这样,当你直接输入你的http://www.website.com/的时候,tomcat就会默认返回
index.jsp给你,你才有机会往下面走,如进到xxx.do的页面。这个应用的根目录是“spring”,
<welcome-file>的配置没有加路径,那么默认就是在spring目录下,所以我们这个index.jsp就是
放在spring目录下。

在web.xml中,第二个要配的就是<servlet>,其中<servlet-name>随便配,只要跟后面
<servlet-mapping>中的<servlet-name>能对应得上就行。
<servlet-class>是你要处理http请求的实际类,既然我们是spring的web应用起步,
就简单的用它的DispatcherServlet,实际上,只要是httpServlet的子类且覆写了它的service方法,
都可以配到<servlet-class>中, 哥试着写了一个HttpServlet的子类,在service方法中,直接调用
esponse.getWriter().print("<html>...</html>");返回结果页面给客户端IE。

<init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>/WEB-INF/config.xml</param-value>
</init-param>
上面这一段,你可以配置你想要使用的配置文件,有多个就配多个<param-name>和<param-value>对。
你可以在里面配置spring的beans配置文件,也可以添加struts的,ibatis的,其他第三方框架的配置文件
<servlet-class>里面配置的类,总有办法能获取配置文件的信息,也许是Tomcat容器帮你载入配置信息,
也很有可能是容器仅提供配置文件的路径,由servlet自身在init方法中去载入这些配置文件的内容。
估计spring的DispatcherServlet是通过反射,将<param-name>跟<param-value>注入到类的属性中,
然后再用自己的一套读配置文件的接口读入配置信息。
<load-on-startup>这一项,哥完全是直接抄过来的,貌似在这个起步应用里没用。

<servlet-mapping>里面的东西就不用说了,无非就是告诉容器,只有包含.do 的http请求,才会交给
DispatcherServlet来处理。

web.xml分析完了,但是现在发现我们才弄明白了MVC中的C(Controller),那么,M跟V何解?
我们去看看/WEB-INF/config.xml就知道了:

[config.xml start]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans">
<!-- 上面这行,后面还跟了堆命名空间啥的不管它,为节省篇幅,这里去掉 -->  
       <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewReso lver">
              <property name="viewClass">
                      <value>org.springframework.web.servlet.view.JstlView</value>
              </property>
       </bean>
      
       <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
              <property name="mappings">
                      <props>
                            <prop key="/login.do">loginAction</prop>
                      </props>
              </property>
       </bean>
      
       <bean id="loginAction" class="com.huawei.guoqing.springmvc.LoginAction">
              <property name="commandClass">
                      <value>com.huawei.guoqing.springmvc.LoginBean</value>
              </property>
              <property name="success_view">
                      <value>loginok.jsp</value>
              </property>
              <property name="fail_view">
                      <value>loginfail.jsp</value>
              </property>
       </bean>
</beans>
[config.xml end]

先看看 <bean id="viewResolver"></bean> 这一项:
id="viewResolver",这个"viewResolver"是个特殊的字符串,查看
DispatcherServlet.java的源代码,在
private void initViewResolvers(ApplicationContext context)
这个方法里面,有这样两行:
                            ViewResolver vr = context.getBean(VIEW_RESOLVER_BEAN_NAME, ViewResolver.class);
                            this.viewResolvers = Collections.singletonList(vr);
注意到 VIEW_RESOLVER_BEAN_NAME 是一个常量:"viewResolver",可见,spring把你在
<property name="viewClass"></property>中配的类实例化,注入到DispatcherServlet中,供其使用。

下面这个bean的配置比较蛊惑:
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
id="urlMapping"这个是根据学习资料配的,但是实际上哥无论把id改成什么,比如 id="abcMapping",
这个WEB应用一样正常工作,可见,这玩意不是通过名字来注入的。然后,哥配了两个bean,分别为

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

<bean id="abcMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

发现,哪个配在前面,实际上 DispatcherServlet 调用的就是哪一个,然后,因为
BeanFactory中有这样的获取bean的方法:getBean(Class<T> arg0);推测,这个bean的配置关键是在
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping",只要你class配置
为SimpleUrlHandlerMapping(按spring的习惯,应该是SimpleUrlHandlerMapping的父类或接口,接口的
可能性更大)。容器就会根据类型去取道bean,注入给Servlet使用。

<bean id="urlMapping">这个bean的配置里面,最重要的就是
<prop key="/login.do">loginAction</prop>
key="/login.do",这个login.do,就是对应我们写在 index.jsp中的这一行:
<form id="form1" action="login.do" method="post">
DispatcherServlet 发现你页面提交过来的url是login.do,就会交给loginAction去处理。

这个loginAction嘛,看看我们的config.xml里面的最后一个bean定义:
<bean id="loginAction" class="com.huawei.guoqing.springmvc.LoginAction">
具体的处理类完全由我们自己实现,这就同Spring没有太紧密的耦合,这里比 <bean id="viewResolver">
跟 <bean id="urlMapping" class="xxxx"> 舒服多了。但是,我们的
LoginAction 还是必须为 org.springframework.web.servlet.mvc.SimpleFormController 的子类

注意到我们的loginAction里面,有这么一项:
              <property name="commandClass">
                      <value>com.huawei.guoqing.springmvc.LoginBean</value>
              </property>
嗯,这一项也是完全由我们自己实现的
看看LoginAction.java的代码,我们必须覆写 父类 SimpleFormController 中的 onSubmit 方法
       protected ModelAndView onSubmit(Object cmd,BindException be)
       {
       }

Spring会把你的 commandClass 实例化 ,在调用onSubmit注入到cmd这个参数里面去。
这里Spring封装得很好的一个就是,只要你的 commandClass 的属性(这里commandClass就是 LoginBean),
跟jsp页面的表单输入项的一样,Spring就帮你自动把值注入,很是方便:

index.jsp中代码片断:
               用户名 <input type="text" name="username"/>
         密码 <input type="text" name="password"/>

LoginBean.java代码片断:
              private String username;
              private String password;    
             
Spring会把页面上的 <input type="text" name="username"/>的内容,注入到
LoginBean的 username 属性 (应该要有相应的setter方法)。

最后,看这一项:
              <property name="success_view">
                      <value>loginok.jsp</value>
              </property>
看看 LoginAction.java 的 onSubmit(Object cmd,BindException be)方法,就知道是干嘛的了:
              HashMap resultMap = new HashMap();
              return new ModelAndView(this.success_view, resultMap);

Spring会帮你把页面返回到 loginok.jsp;至于这里ModelAndView这个类是怎么生成jsp的,还没有去研究。
因为我们没配置前缀后缀参数,所以返回的是webapps\spring 这个根目录下面的 loginok.jsp
(想了解更详细的配置,如前缀,后缀,请自行查阅相关资料)


总结:这样,我们就把用spring如何搭建WEB应用基本讲明白了,你想替换它的view就替换,想替换model就替换,
就是想替换Servlet也没问题。可以用第三方的MVC框架而不必拘泥于Spring的,但是不建议自己写MVC,因为,
你要从request里面提取页面的各项输入,甚至还有附件的byte流。然后再注入你自己的model,生成你自己的view类,
实在不是一件轻松的事。我们知道它的原理就好。


最后补充一些东西:
因为搭建应用过程中遇到问题,页面报错,查看了Tomcat日志,才发现是少了jar包,
弄了好几次才搞好(每次提示少这个jar包,添加进去后启动tomcat,又报少另一个),
所以把哥自己应用下的目录结构列一下,(文件名后面跟[d]的,表示是一个目录)
[dirTree start]

           spring[d]
           ----index.jsp
           ----loginok.jsp
           ----loginfail.jsp
           ****WEB-INF[d]
                   ----web.xml
                   ----config.xml
                   ****classes[d]
                           ----{这里是你自己的.class文件}
                   ****lib[d]
                           ----commons-logging.jar
                           ----commons-logging-api-1.1.jar
                           ----jstl.jar
                           ----log4j-1.2.8.jar
                           ----org.springframework.asm-3.0.2.RELEASE.jar
                           ----org.springframework.beans-3.0.2.RELEASE.jar
                           ----org.springframework.context-3.0.2.RELEASE.jar
                           ----org.springframework.context.support-3.0.2.RELEASE.jar
                           ----org.springframework.core-3.0.2.RELEASE.jar
                           ----org.springframework.expression-3.0.2.RELEASE.jar
                           ----org.springframework.web-3.0.2.RELEASE.jar
                           ----org.springframework.web.servlet-3.0.2.RELEASE.jar
                           ----servlet-api.jar
                          
[dirTree end]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring搭建Web应用(MVC)起步(Tomcat环境) 的相关文章

  • Java:如何将所有 java 日期分组到相应的周中?

    Problem 我有一个很大的日期清单 我需要按周安排它们 问题 如何按以下方式对日期进行分组一年中的一周他们在吗 示例数据集 Date date new SimpleDateFormat parse 04 01 2015 Date dat
  • wsimport Xauthfile 错误

    我正在尝试为我们公司网络外部的受 SSL 保护的 Web 服务 在 Microsoft Biztalk 上 生成客户端 也称为消费者 所需的 java 帮助类 我们只能通过代理访问它 并且无法更改 Web 服务本身的任何内容 这是我提供给
  • Java 1.6 和 Desktop.open() 的问题

    我一直在使用 Destop open 在 Windows 计算机 Vista 和 XP 上启动 pdf 查看器 并且大多数都工作得很好 但是 在一台 XP 计算机上 该调用不起作用 只是返回而不抛出任何异常 并且查看器不会启动 据我所知 在
  • 避免多模式数据库上的代码重复

    我有一个遗留应用程序 其中的数据库将数据拆分为同一物理数据库上的多个模式 这些模式在结构上是相同的 我使用 Spring Boot Data JPA 的微服务来处理单个模式 然后 为了避免代码重复 我创建了一个路由器服务 将请求转发到单个架
  • 用零向左填充字符串[重复]

    这个问题在这里已经有答案了 我见过类似的问题here https stackoverflow com questions 388461 padding strings in java and here https stackoverflow
  • Java 似乎找不到我的本机库

    我正在尝试从我的 jar 中运行我的程序 名为 PViz jar 该 jar 位于一个目录中 其中包含所有依赖的 jar 以及它们所依赖的 so 文件 我使用的是 Mac OS X 当我运行此命令时 java cp PViz jar pvi
  • JOOQ初始化DAO最佳方法

    我想知道初始化 JOOQ 生成 DAO 的最佳实践 现在 我使用以下方法来初始化 JOOQ 生成的 DAO 在以下情况下 Student Dao 是 JOOQ 生成的 public class ExtendedStudentDAO exte
  • 请求的操作:声明您的广告 ID 权限

    今天我收到这封电子邮件 去年 7 月 我们宣布了广告政策变更 以帮助加强 安全和隐私 我们对使用的标识符添加了新的限制 针对儿童的应用程序 当用户选择删除他们的 广告 ID 以选择退出个性化广告 如果满足以下条件 开发人员将收到一串零而不是
  • Hibernate 过滤器仅在从数据库加载数据后应用吗?

    我在网上发现了一些相互矛盾的信息 有谁知道Hibernate过滤器是否影响生成的sql 或者只是过滤从数据库读取的数据 休眠过滤器影响 where 子句生成的 SQL The Hibernate 过滤器简介 http java dzone
  • 将 person.city.name 添加到 TableView

    我有一个 TableView 和一些 POJO 并且想要将其中一个属性绑定到 TableView 然而 该属性也是一个 POJO 并且应该有一个属性显示在 TableView 中 这是我的代码
  • Java 8 元空间垃圾收集

    我正在运行的 java 进程在运行的第一个小时左右始终表现良好 然而 性能会迅速下降 在分析时 我发现元空间垃圾收集相当频繁地发生 直到小时标记 然后失去控制 我相当确定我能够使用 XX MaxMetaspaceSize 选项来解决此问题
  • Google-GSON 的 Spring MVC 映射视图?

    有谁知道是否有 Spring MVC 映射视图Gson http code google com p google gson 我正在寻找类似的东西org springframework web servlet view json Mappi
  • 使用 Maven 时如何在 Tomcat 7.0 中将上下文路径设置为根(“/”)

    我有一个maven项目 pom xml包含tomcat插件
  • ViewCompat.setOnApplyWindowInsetsListener使状态栏颜色消失

    这是我用来检测何时的代码Keyboard Height变化 唯一的问题是Statur Bar当此代码运行时 颜色消失并变为白色 ViewCompat setOnApplyWindowInsetsListener this getWindow
  • 使用Java 8开发的程序可以在Java 7上运行吗?

    我有点困惑 Oracle 表示 Java 8 与 Java 7 向后 高度兼容 但是 Java 8 程序有什么可能性可以在 Java 7 上成功运行 SE EE 呢 如果第一点为真 Java 8 应用程序将在 Java 7 服务器支持上部署
  • 如何在JavaFX中获得狭窄的进度条?

    正如标题所说 我需要制作一个细进度条 我用过这个 progressBar setMaxHeight 0 1 progressBar setPrefHeight 0 1 但这行不通 有人有想法吗 你必须搞乱样式才能让它变小 我真的建议看看ca
  • 在 OpenCV 中将 `BufferedImage` 转换为 `Mat`

    我怎样才能转换BufferedImage to a Mat in OpenCV 我正在使用 JAVA 包装器OpenCV not JavaCV 由于我是新手OpenCV我在理解如何做时遇到一些问题Mat works 我想做这样的事情 基于
  • Spring:了解 @SessionAttributes 与 @Scope('session') 之间的区别

    Case 1 Scope Session public class Employee Controller public class EmployeeController Autowired private Employee employe
  • 如何处理 Sonarlint java:S2259 (空指针不应取消引用)

    if res getBody null res getBody getServiceResult null return 在上面的代码中 sonarlint 抱怨说 SonarLint 可能会抛出 NullPointerException
  • 从 Eclipse 启动时创建新的 JFrame 时 Java 将关闭。没有抛出异常

    我正在开发一个在 Eclipse 中开发的 Java 项目 直到今天一切都很好 昨天 在完成我的项目之前 我最后一次运行它以检查一切是否正常并且运行正常 但是今天 当我启动该项目并按下 运行 时 我的应用程序就神秘地关闭了 没有崩溃 没有消

随机推荐

  • python自动化登录163邮箱发送邮件

    记录第一次自动化发送邮件成功 第一步 准备好 HTMLTestRunner py文件放在下面这个路径 第二步 创建 Mail163 yaml 存放信息 testURL http mail 163 com user1 username xxx
  • 手机拨出等待时间长_手机打不出去电话怎么回事 一分钟轻松排查原因

    近段时间 有网友询问 手机出现打不出电话的情况 这是咋回事呢 针对这个问题 我们罗列出了几种可能性 一起来看一下是什么造成这种情形的吧 具体方法 第一步 我们将手机重启 并且长按电源键几秒钟 重新开机 如果没有回应 就需要插拔电板 再开机
  • input上传视频并本地预览

  • 深入理解Flutter Platform Channel

    作者 闲鱼技术 皓黯 相信读者们在阅读了我们之前的文章后 对Platform Channel有了一定的理解和认识 但是由于篇幅有限 上文并未对Platform Channel的工作原理进行详细的讲解 Platform Channel如何工作
  • 探秘Linux下正确获取物理内存大小的方法与技巧

    探秘Linux下正确获取物理内存大小的方法与技巧 在Linux系统中 正确获取物理内存大小是一个非常重要的任务 物理内存大小是计算机系统性能和资源管理的关键指标之一 它直接影响到系统的稳定性和性能 在本教程中 我们将介绍几种方法和技巧 帮助
  • 计算机故障与日常维护论文,浅析计算机的日常维护与故障维修.pdf

    ISSN1009 3044 E mail kfyj ComputerKnowledgeandTechnology电脑知识与技术 第10卷第5期 2014年2月 ComputerKnowledgeandTechnology 电脑知识与技术 V
  • 【重识云原生】第三章云存储第一节——分布式云存储总述

    重识云原生系列 专题索引 第一章 不谋全局不足以谋一域 第二章计算第1节 计算虚拟化技术总述 第二章计算第2节 主流虚拟化技术之VMare ESXi 第二章计算第3节 主流虚拟化技术之Xen 第二章计算第4节 主流虚拟化技术之KVM 第二章
  • 关于小网站抄袭

    昨天 我在百度搜索自己的公众号里文章名字才发现 居然被一个小网站 女黑客导航 http www nvhacker com 2021 08 05 e7 a4 be e5 b7 a5 e5 9f ba e7 a1 802 抄袭了 我辛辛苦苦写的
  • centos7火狐浏览器上不了网_明明连上WiFi却上不了网?教你几种方法,让你永不断网...

    智能时代的崛起 wifi已经成为我们身边不可缺少的一部分 甚至就连上班的第一件事也从打开电脑变成了打开手机wifi阅览新闻 当然有时我们也碰到一些bug发生 就是已经连上了wifi 却不能正常的上网 甚至连网页都打不开 而今天小编就来说说这
  • Mac构建Protobuf

    Protobuf源码下载 https github com JumpWu xls2protobuf tree master protobuf V3 0 1 切换到protobuf V3 0 根目录 运行 autogen sh前 我们需要先安
  • 聊聊G1垃圾收集器

    作为一款高效的垃圾收集器 G1在JDK7中加入JVM 在JDK9中取代CMS成为了默认的垃圾收集器 1 垃圾收集器回顾 1 1 新生代 新生代采用复制算法 主要的垃圾收集器有三个 Serial Parallel New 和 Parallel
  • 深度可分离卷积的计算量

    深度可分离卷积将传统的卷积分解为一个深度卷积 depthwise convolution 一个 1 1的卷积 pointwise convolution 如下图所示 a 是传统卷积 b c 分别对应深度可分离卷积的深度卷积和 1 1的卷积
  • 如何放大matlab结果局部图

    如何放大matlab结果局部图 最近发现这个功能对于论文写作可以说是非常有帮助了 于是记录下来方便各位师兄或者师弟使用 也为了防止自己忘记 生成如下所示的结果 非常美观和加分 首先记得下载magnify文件 具体的magnify压缩包文件也
  • 【原创】CPU性能优化小记

    CPU性能优化小记 文章目录 CPU性能优化小记 一 现象 TOP各指标含义 二 分析 启动应用前 启动应用后 采集内核函数的方法 内核采集分析 火焰图分析 三 解决 一 现象 业务线反馈 单板只要一跑我们的通讯软件appA CPU就变得很
  • Linux驱动之系统移植----uboot移植(有设备树版本),完整移植.

    uboot版本 uboot2020 04 开发板 100ask imx6ull pro 拿到官方uboot后第一步先编译烧写测试 查看哪些驱动可用 哪些不可用 根据开发板厂商提供的资料 使用mx6ull 14x14 evk defconfi
  • 屏幕显示质量的直接影响因素及其在编程中的应用

    屏幕显示质量对于用户体验和视觉效果至关重要 在编程中 我们可以通过一些技术手段来提高屏幕显示的清晰度和质量 本文将介绍一些直接影响屏幕显示清晰度的因素 并提供与之相关的编程示例 分辨率 屏幕分辨率是指屏幕上像素点的数量 通常用水平像素数乘以
  • vue 3.x基础入门:vue 的指令与过滤器

    前置基础知识 Vue3 0入门 基本使用以及vue的调试工具 文章目录 一 vue的指令与过滤器 1 1 指令的概念 1 2 内容渲染指令 v text 语法 v html 1 3 属性绑定指令 属性绑定指令的简写形式 使用 Javascr
  • 虚幻引擎5 (UE5):完整的初学者学习教程

    流派 电子学习 MP4 视频 h264 1280 720 音频 AAC 44 1 KHz 语言 英语 中英文字幕 根据原英文字幕机译更准确 大小解压后 6 26 GB 时长 7h 32m 虚幻引擎5的最快入门方法云桥网络 平台获取教程 你会
  • 关于BeautifulSoup的总结

    最近一直在用BeautifulSoup 但是语法很容易忘记 在这里做个学习总结吧 参考 Beautiful Soup 4 2 0 文档 功能 BeautifulSoup是用来从HTML或XML中提取数据的Python库 导入 使用方法 fr
  • Spring搭建Web应用(MVC)起步(Tomcat环境)

    Spring搭建Web应用 MVC 起步 Tomcat环境 转载 首先 建立WEB应用的目录 必须的 在tomcat的webapp目录下 创建目录 spring 目录结构如下 spring WEB INF classes lib 然