发表于: 2020-11-16 23:55:50
1 1437
今天完成的事情:
跑通Java springmvc web项目
以下这个错误,将tomcat中war 修改为 war exploded,就跑通了。
war和war exploded的区别
war模式:将web工程以war包的形式上传到服务器
war exploed模式:将web工程以当前文件夹的位置关系上传到服务器
war模式这种可以称之为是发布模式,看名字也知道,这是先打包war包,再发布;
war exploded模式是直接把文件夹,jsp页面,classes等等移到Tomcat部署文件夹里面,进行加载部署。因此这种方式支持热部署,一般在开发的时候也是用这种方式。
所以刚才是没有把jsp页面导进去,才出错的。
第二个错误,数据不能出现。在网址后面加上/Student/getAllStudent,就出现了。
tomcat的作用?StudentController是通过什么把数据传到jsp页面的?spring-servlet.xml在这当中作用是什么?web.xml的作用?
SprigMVC,运行逻辑
MVC是一种设计模式,它强制性地把应用程序的数据展示(view)、数据处理和流程控制分开。
MVC将应用程序分成3个核心模块:模型、视图、控制器,他们相互联结又分别担当不同的任务,如图示所示。
MVC(Model-View-Controller)的概念
MVC(Model-View-Controller)的概念:
Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型(domain)或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据) 和 服务层(行为)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
Value Object(数据),可以称为实体类
服务层(service),服务层下面一般有dao层,负责和数据库进行交互,这个由于没有连接数据库,所以直接把数据写在了dao层,服务层(service)调用者dao层的方法(findAll)
View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
jsp是什么?jsp和html有什么区别?
JSP(Java Server Page)看这个意思就知道是Java服务端的页面,所以它是动态的(),它是需要经过JDK编译后把内容发给客户端去显示,我们都知道,Java文件编译后会产生一个class文件,最终执行的就是这个class文件,JSP也一样,它也要编译成class文件!JSP 不止要编译,它还得要转译,首先把JSP转译成一个Servlet文件,然后再编译成class文件。当用户访问JSP时就执行了class文件。
HTML(Hypertext Markup Language)文本标记语言它是静态页面,和JavaScript一样解释性语言,为什么说是解释性 语言呢?因为,只要你有一个浏览器那么它就可以正常显示出来,而不需要指定的编译工具,只需在TXT文档中写上HTML标记就OK。
我把jsp的内容复制到TXT文档中写上HTML标记,打开,发现和之前的对比,缺少了数据,而且这是无法交互的,只能在文档中修改,而JSP,可以直接在数据库修改,然后JSP页面就会直接显示修改结果。
二者的区别:
1.最简单的区别就是,HTML能直接打开,jsp只能发布到Tomact等服务器上才能打开 。
2.定义上HTML页面是静态页面可以直接运行,JSP页面是动态页它运行时需要转换成servlet。
3.他们的表头不同,这个是JSP的头“ <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>”在表头中有编码格式和倒入包等。
4.也是很好区分的在jsp中用<%%>就可以写Java代码了,而html没有<%%>
5.html是w3c规范的一种网页书写格式,是一种统一协议语言,静态网页。我们上网看的网页都是大部分都是基于html语言的。jsp是一种基于动态语言,jsp可以实现html的所有任务
html静态网页示范:
Controller(控制器):接收用户请求,委托给模型(model)进行处理(状态改变),处理完毕后把返回的模型数据返回给视图(views),由视图负责展示。 也就是说控制器做了个调度员的工作。
@RequestMapping是一个用来处理请求地址映射的注解,可用于类或者方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
1.value, method
value:指定请求的实际地址,指定的地址可以是URI Template模式。
method:指定请求的method类型,GET、POST、PUT、DELETE等。
@RequestMapping(value = "/getAllStudent", method = RequestMethod.GET),这里GET是获取一个资源
比如这个路径加这个路径就可以显示出数据了,
查看ModelAndView源码,发现这个是一个类似实体类的结构,有很多构造方法
setViewName就是setxxx方法,mav.setViewName("studentDisplay"); 将ViewName(视图位置设置成studentDisplay)
mav.addObject("students", studentService.getAllStudent());
相当于request(请求)的setAttribut(设置属性),在JSP页面中通过studentService.getAllStudent()获取数据。
查看addObject源码发现attribute Name(属性名称) attribute Value(属性值)
而"students"和jsp中得items对应起来,studentService.getAllStudent()这个目的就是获取student中的值,和var对应起来。
加入@ResponseBody并没有报406错误,返回的是一个正常的页面
@ResponseBody
作用:
将controller方法返回的对象,根据Response Headers(响应标题)下面的Accept的值,通过适当的转换器转换为指定格式时,写入到response对象的body数据区。
注意:
只有当该方法是要返回某种格式的数据才能使用,比如返回json、xml,如果该方法需要返回是页面,则不能使用。
Response Headers(响应标题)下面的Accept的值,在代码中并没有发现这两个参数,下次碰到在详细了解吧。
正常的页面:
spring-servlet.xml
开启spring扫描注入和开启注解驱动,这个在spring整合mybatis已经使用过了
下面bean的作用:会根据Handler方法执行之后返回的ModelAndView的视图(如studentDisplay.jsp的具体位置),来加载界面相应界面并绑定反馈数据。
InternalResourceViewResolver(内部资源视图解析器),看来这个就是连接controller和jsp的中间件了,
Handler方法是什么?搜了一下发现这个Handler就是spring mvc的核心,就是controller
调用方法处理业务,返回ModelAndView都用到了Handler,但在代码中并没有见到Handler,只见到了controller。
图三:
web.xml详解,明天修改一下,看会出现什么效果
<?xml version="1.0" encoding="UTF-8"?>
<web-app> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
version="3.0">
<display-name>Archetype Created Web Application</display-name>
<!--使用Spring MVC,配置DispatcherServlet是第一步。DispatcherServlet是一个Servlet,,所以可以配置多个DispatcherServlet-->
<!--DispatcherServlet是前置控制器,配置在web.xml文件中的。
拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller(我们写的Action)来处理。-->
<servlet>
<servlet-name>spring</servlet-name><!--在DispatcherServlet的初始化过程中,框架会在web应用的 WEB-INF文件夹下寻找名为[servlet-name]-spring 的配置文件,生成文件中定义的bean。-->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--指明了配置文件的文件名,不使用默认配置文件名,而使用spring-servlet.xml配置文件。-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!--其中<param-value>**.xml</param-value> 这里可以使用多种写法-->
<!--1、不写,使用默认值:/WEB-INF/<servlet-name>-spring-->
<!--2、<param-value>/WEB-INF/spring-servlet.xml</param-value>-->
<!--3、<param-value>classpath*:spring-servlet.xml</param-value>-->
<!--4、多个值用逗号分隔-->
<param-value>/WEB-INF/spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup><!--是启动顺序,让这个Servlet随Servletp容器一起启动。-->
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<!--Servlet拦截匹配规则可以自已定义,当映射为@RequestMapping("/user/add")时,为例,拦截哪种URL合适?-->
<!--1、拦截*.do、*.htm, 例如:/user/add.do,这是最传统的方式,最简单也最实用。不会导致静态文件(jpg,js,css)被拦截。-->
<!--2、拦截/,例如:/user/add,可以实现现在很流行的REST风格。很多互联网类型的应用很喜欢这种风格的URL。弊端:会导致静态文件(jpg,js,css)被拦截后不能正常显示。 -->
<url-pattern>/</url-pattern><!--会拦截URL中带“/”的请求。-->
</servlet-mapping>
<welcome-file-list><!--指定欢迎页面-->
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
studentDisplay.jsp文件,主要是这行代码:<c:forEach var="Student" items="${students}">
forEach标签
forEach标签会无数次的反复遍历body content或者集合对象。可以遍历的对象包括java.util.Collection和java.util.Map的所有实现,以及对象数组或者基本类型。也可以遍历java.util.Iterator和java.util.Enumeration,但不应该在多个行为中使用Iterator或者Enumeration,因为无法重置Iterator或者Enumeration。
所以var="Student" items="${students}" var和实现类,items和controller类一一对应上了
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Spring MVC Hello World</title>
</head>
<body>
<h2>All Students in System</h2>
<table border="1">
<tr>
<th>Id</th>
<th>Name</th>
<th>Age</th>
<th>Sex</th>
</tr>
<c:forEach var="Student" items="${students}">
<tr>
<td>${Student.id}</td>
<td>${Student.name}</td>
<td>${Student.age}</td>
<td>${Student.sex}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
明天计划的事情:
动态SQL,使用自定义域名并通过配置本地Host来配置DB连接文件
ResultMap
为什么不可以用Select * from table?
CreateAt和UpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口?
JSP中的相对路径和绝对路径
spring mvc首页设置
给出CRUD的接口文档格式
根据接口文档,使用Spring Rest 编写对应的Controller
遇到的问题:
以上
收获:了解spring-mvc框架每个项目的作用
评论