第一部分:主要学习Spring 框架 和MyBatis与Spring框架的整合。首先是学了Spring怎么开发项目,关于怎么配置pom.xml文件,applicationContext.xml文件。
再然后学习MyBatis与Spring框架的整合。重点关于MyBatis框架需要的依赖包,以及 配置它的工厂类和Mapper方法 。 以及学了 Mapper.xml 文件的配置。最后扩展了log4.properties日志文件
验证成果:使用Spring开发项目 ; 使用Mybatis和Spring整合 开发项目。
第一部分学的很基础。接下来细讲。第二部分的学习:前半部分讲mybatis的sql映射文件的细节补充。 主要是从第三个知识点开始, Spring MVC的学习很重要。
一、映射器
映射器是关于MyBatis的SQL映射文件 。 主要讲述MyBatis的核心配置文件:mybatis-config.xml 以及 SQL映射文件:Mapper.xml 。
Mapper.xml文件: 主要了解这五个元素
<select> 查询语句 ,返回结果集 。可以用POJO返回,也可以用resultMap(自定义结果集)返回
<insert> 返回一个整数。
<delete> 返回一个整数。
<update> 返回一个整数。
<resultMap> 提供映射规则 。 常用于级联关系 (这个需要结合数据库系统原理的知识学一下)
传递多个参数(也称为使用POJO存储结果集):
主流多使用Java Bean 传递多个餐宿 ,其实就是POJO类(持久类)。大概原理就是将从数据库获得数据赋给这些属性 。(我们在Java Web的学习里面 经常使用 ,就是一个set ,然后一个get)
级联查询(重难点):建议学号数据库的系统原理再来。
一对一级联:比如一张身份卡对应一个人 。一个人也只能对应一张身份证。(通过人的id和订单id级联)
一对多级联:比如一个人可以有多个订单,但一个订单只能属于一个人。(通过人的id和订单id级联)
多对多级联:其实就是设置了一个中间表,然后分为两个一对多级联。但是这个中间表不需要创建持久类PO。
需要掌握两种方式的级联:
1.嵌套结果 。 执行一个SQL语句。 用到元素:<resultMap > <select>
2.连接查询。(使用POJO存储结果集)。用到元素:<select>
第一遍看书的收获:比方说 创建POJO类 它的作用是存储结果集 。 而持久类 不是用来存储结果集的 ,它可以表示数据库单个表的内容 。 这是一点区别。
还有就是 我们什么时候使用 创建POJO类呢 ,就是需要存储结果集 ,并输出结果集的时候 。
它们的联系是什么呢?当只有单个表的时候,创建的持久类 既可以用作POJO类存储结果集,也可以连接数据库的表 。 而有两个以上的表 ,且存在级联关系的时候 , 那么就需要创建POJO类 来存储新的结果集 ,这个时候就不同于持久类了。
这么说,当是单个表的时候,持久类可能需要重写toString的方法。但当是两个表且存在级联关系 , 那么持久类不需要重写toString的方法 ,而是交给了 POJO类。
实训练习(暂时pass):通过一对一级联 根据UID查询用户及关联的身份证cord 。
通过多对多级联 根据ID查询订单表 及 关联的商品表
二、动态SQL(需要记忆)
主要讲解如何拼接 MyBatis的动态SQL 语句。主要学习几个元素的用法。这几个元素用的还是比较多的。参考书本p122开始学习。(心痛:本来这里已经编辑好了,结果电脑蓝屏没有保存)
主要有几个用法需要记下:
<if>元素 基础元素
<where>元素
<set>元素
<trim>元素
<foreach>元素 常用于遍历或者操作多个元素 (比如删除多个记录)
参考使用方法:(其它方法的用法都差不多)
`<foreach>`元素用于在SQL语句中动态生成多个参数值,常用于`IN`语句中。它的属性主要有`collection`、`item`、`index`、`open`、`separator`和`close`。
- `collection`: 指定要遍历的集合。该属性是必须指定的,要做foreach的对象。
- `item`: 表示本次迭代获取的元素,若collection为List、Set或者数组,则表示其中的元素;若collection为map,则代表key-value的value。
- `index`: 索引,指定一个名字,用于表示在迭代过程中,每次迭代到的位置。遍历list的时候index就是索引,遍历map的时候index表示的就是map的key,item就是map的值。
- `open`: 表示该语句以什么开始,最常用的是左括弧'('。
- `separator`: 表示在每次进行迭代之间以什么符号作为分隔符。
- `close`: 表示该语句以什么结束,最常用的是右括弧')'。
举例:
<!-- in查询 -->
<select id="selectUsers" resultType="User">
SELECT * FROM user
WHERE id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<!-- 批量插入 -->
<insert id="insertUsers">
INSERT INTO user (name, age)
VALUES
<foreach collection="users" item="user" separator=",">
(#{user.name}, #{user.age})
</foreach>
</insert>
重点部分:三、Spring MVC入门
前面学习Java Web的知识的时候介绍过MVC ,现在在回到MVC,主要学习Spring框架和MVC模型结合的使用。
MVC模型:Model(模型) 、 View(视图) 、 Controller(控制器)
基于Servlet的MVC模式:
模型:一个或多个JavaBean对象,用于存储数据(实体模型,由JavaBean类创建,即持久类)和处理业务逻辑(业务模型,由一般的Java类创建,分为dao层、service层)
视图:一个或多个Jsp页面,向控制器提交数据和模型 提供数据显示,JSP页面主要使用HTML标记和JavaBean标记来显示数据。
控制器:一个或多个Servlet对象,根据视图提交的请求进行控制,即将请求转发给处理业务逻辑的JavaBean,并将处理结果 存放到实体模型JavaBean中(即POJO类) ,输出给视图显示。
回顾前面学过的知识点:
(37条消息) Servlet和JavaBean开发(VO)(javaWeb第二部分)_one day321的博客-CSDN博客
回顾结合Java Web框架 开发servlet项目:
(37条消息) 应用开发与框架(JavaWeb学习 第三部分)_one day321的博客-CSDN博客
Spring MVC 工作原理:(重点)
如图:
Spring MVC有四个接口:DispatcherServlet、HandlerMapping、Controller、ViewResolver
DispatcherServlet:Web.xml文件 部署这个。它会指向Springmvc.xml。
HandlerMapping:Springmvc.xml文件 用于映射控制器
Controller: 类文件,表示跳转到view页面 ,(业务逻辑层,一般的Java类)
ViewResolver: Springmvc.xml文件 配置,就是一个bean元素。
第一个简单的Spring MVC应用:(不采用注解控制器,在springmvc里编写 指向controller类 的映射)
步骤:
第一步:仍然是 导入依赖包。(Sping web、Spring webmvc、javax.servlet)
第二步: 编写web.xml (这个是主要文件。在Springweb 里面,是对web.xml进行读取。在Spring里面是对applicationContext.xml文件读取。)
需要部署DispatcherServlet :(<servlet>指定数据源 —— <init-param> 指定springmvc的位置 ——<load-on-startup>1表示默认启动</> )
需要指定mapping(映射):<servlet-mapping>
第三步:编写JSP (建议放在首页的位置)
这里关于两个jsp的路径很有意思,用到了EL表达式,"${pageContext.request.contextPath} /login"
第四步:编写控制器代码
这里采用的是ModelAndView类 (这应该是某种返回对象?,作用放这里未知)(也很少使用这种类型)
不过,需要记一下控制器代码 需要继承Controller类
implements Controller (需要注意的是这个Controller 类是mvc.Controller 的导入包)
第五步:编写 springmvc 映射文件 ,在没有开启注解的控制器之前,将映射放在这个文件里面。
结构:首先是访问web.xml文件 , 然后web.xml 告诉 去springmvc ,接着去访问代码。
注意:没有 applicationContex.xml文件 (主要访问的是web.xml文件)
四、对SpringMVC的补充:(一些能提高编码效率的方法)
主要介绍 SpringMVC 基于注解的控制器 。关于接受/请求 参数的方式。应用service层 进行依赖注入。
基于注解的控制器:(需要修改springmvc配置 和控制器类代码)
主要的优点是,它不需要在配置文件部署映射。(像前面第一个SpringMVC的例子,如果采用注解的控制器,那么其实springmvc 里面什么都不用编写了。当然 实际上稍微复杂一点的springmvc应用里面 ,这个配置文件(springmvc.xml)还是很有用的,它可以编写 视图解析器 )
比如:加入注解的控制器之后,需要在spring.mvc文件里面加入扫描器,扫描注解所在的包才能起作用,后面还可以存放视图解析器,用来省略 映射的前后缀。 (在没有扫描器和视图解析器之前,一个spring.xml文件里面 需要name ,和路径 ,而且路径很长 ,加入这些配置之后,路径只需要写那个名字,例如:login 而之前是:/WEB-INF/jsp/login.jsp)
加入注解控制器之后的变化:(主要作用在controller类里面体现)
控制器类变化
之前: 返回路径 是一个完整的路径:/WEB-INF/jsp/login.jsp
之后:返回 就是 login 。(需要添加代码:<RequestMapping("/login")> 放在类的前面(或者放在类方法前面),相当于 之前放在映射文件里面的name 。在jsp里面用的就是name这个名称。 )
springmvc.xml文件变化:
需要扫描器 <context:component-scan>
需要视图解析器 <bean id="" class="InternalResourceViewResolver">
需要注意的是,<RequestMapping("/login")>它的作用,就相当于在jsp里面用的 "${pageContext.request.contextPath} /login" (这两个是对应的)所以名称可以自定义,但要保持和jsp里面返回的对象名称一致。(主要是因为jsp提交数据是给控制器,或者说它两相互交换数据。)
接受请求参数常见的方式:(主要是控制器类使用的方法)
在前面第一个简单的SpringMVC的应用,在控制器类就提到了ModelAndView 类型,就是一个传统的控制器类型。
前面返回的类型是ModelAndView 类型:
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {}
现在学习返回String类型。
public String login() {}
接受参数最常见的方式 是接受jsp传过来的表单数据。
在控制器里面有多种方式可以获取传递过来的参数:
第一种方式通过实体Bean接受请求参数。(√)
作法:就是创建POJO类,然后保持JSP的提交表单<input>的name和POJO类的属性名称相同。然后在控制器类去使用POJO类,就能通过user.getUname() 就能使用它的get方法获取。
(感觉很奇特,居然只要jsp和POJO类的name保持一样就能获取。)
第二种方式通过HttpServletRequest 接收请求参数 。(这个方法和我们之前在JavaWeb学习的方式是一样的。)
String uname = HttpServletRequest.getParameter("uname");
第三种方式 通过@ModelAttribute 接收请求参数 。(这个并不能获取参数,只是对Model类型的一种简约写法)
和在javaweb学习的session购物车方式有点像,但不一样,session购物车方式在这里也可以使用。
@ModelAttribute 的作用,相当于model.addAttribute("userForm",user)。用法和session差不多。但它可以把user的类型值赋给userForm。
@ModelAttribute 单独使用时,还可以作为控制登录权限。详情见书本:P156 第二个知识点。
应用@Autowired 进行依赖注入:(MVC框架 ,重点)
主要体现MVC的思想(后面会专门做一个专题 讲述MVC框架 这个很重要),将M层(模型 代码)从控制器里面分离出来,称为service层。 这样简化了controller的职责,控制层只与jsp做数据交换的作用。
service层存放业务逻辑,需要使用到@Service (注解是一个服务)。
实训:(重要的)
1.在前面第一个SpringMVC 的应用里面修改,使用基于注解的控制器。
第一个问题:
在controller层要使用@Controller 注解。否则,在springmvc.xml 里面会识别不到controller类的注解@RequestMapping
小结:controller是和jsp相互交换数据,通过@RequestMapping 标识的名称。
2.使用Bean的方式传递参数,实现注册和登录 页面。或者 使用HttpServletRequest 的方式获取 表单提交过来的数据。
emmmm,离谱呀,找了好久的原因,一直以为是 某个地方导入或者是某个语法没用对,结果的原因居然是,我在JSP的页面里面upass 和Controller对应的属性upass写错了,结果导致,一直没能获取到密码。所以也就导致登录一直失败!!!(upass被我写成了pass,没有对应)
改正:请编写测试,这里我用的方式是添加日志功能,把日志加入进去。然后查看是否正确获取到了表单数据。
第二个问题:关于乱码的问题.虽然打印了日志内容(“注册失败”),但是中文乱码了。这个问题,后面会讲。
3.使用MVC框架 ,在第二个应用的基础上 将业务逻辑分离出来。并实现注册和登录页面。
第一个误区:编写Service层 使用String作为返回类型。(正确用法是使用boolean类型)
这里就需要 区分一下Service层和Controller层的作用。Controller是和jsp(view)交互的,也就是说Controller的返回对象一定是jsp。而Service层就是把业务从Controller层分离。
这里要分离的业务就是登录和注册。那么Service将返回的结果交给Controller进行判断,应该是什么类型?
应该就是boolean类型,将是否登录成功 的true和false返回给Controller层进行判断 选择哪一个JSP页面。
第二个知识点:依赖注入的方式。将service层注入到controller层,需要在xml配置文件里面 添加扫描器,扫描service包。
有几个用法需要额外注意一下:
@ModelAttribute = Model model model.addAttribute();
这个用法 比session感觉在实时性方法更加强,session购物车的用法必须保存一次才能使用,而且会一直保存在购物车里面 。 直到后来有数据对它进行了更替。
ModelAttribute 它的话,就是调用一次,就能使用EL表达式输出出来。非常方便。
(还记得Java Web学习里面,提供的那个验证码的实训吗,当时,我们使用session存放验证码,结果导致的问题就是 每一次输入的验证码 都是上一次验证码的图片。这就是session必须保存一次才能使用的原因所导致。现在学了ModelAtribute之后这个问题应该就能得到解决了)
五、类型转换和格式化(可以跳过,去学数据绑定)
一般表单或者jsp提交过来的数据都是String类型,如果要将它们转换成int 或者其它类型。就需要用到类型转换。在前面Java Web的学习里面,我们是创建Servlet类的方法,在里面 通过强类型转换 可以实现类型转换。现在学习 在Spring MVC的框架里面如何实现。
在Spring MVC里面,就不是Servlet类,而是Controller类。它提供了两种方式:Converter(自带的类型转换器) 和自定义类型转换器。自由选择。
最简单的用法就是 在Controller类里面,输入的参数类型和 JavaBean类型对应就可以。
例如:
public String add(String name,double price,int number){ return "sucess"; }
(name、price、number都是JavaBean里面对应的类型。)
自定义类型转换器:(用的不多)
需要创建一个自定义转换类型 的类。GoodsConverter类 (自定义)
然后继承Converter<String,GoodsModel>
String为表单的提交过来的数据类型,GoodsModel是POJO类型。将String类型全部转为POJO类型。
需要用到:goods.setname(StringValues[0])、
goods.setPrice(Double.parseDouble(StringValues[0] )) //还是用到了强类型转换
最后在springmvc.xml配置文件里面,注册定义的类型转换器。
这样就能在jsp里面,使用 这个的方法。
六、数据绑定 和表单标签库 (重点)
数据绑定比较重要,它往往都是和表单标签库结合起来一起使用的。所以就一起讲了。此外,还会扩展一下JSON的数据交互。(这个JSON的交互其实就是AJAX的用法,我们在Java Web里面也讲过,就是在JSP文件里面,创建的一个JavaScript应用。不过因为多了控制器,它的用法就增多了一些)
数据绑定 结合表单标签库:
数据绑定的好处,在于 不用进行数据类型转换,也就是上面的那部分知识是可以跳过。进行数据绑定 能将JSP和controller交互数据类型(自动转换) 一 一对应。
主要作法:在JSP页面输入 绑定标签。使得JSP的数据可以绑定到Controller 里面。
(一点疑问,在前面我们没学习数据绑定的时候,JSP的数据本来也是交互给Controller里面,那么学习数据绑定对它的绑定 意义何在? 虽然现在不是很能理解,但不得不说,使用数据绑定的方式是主流的用法,还是需要认真学完这个部分,习惯于它的用法)
数据绑定,主要改变JSP的代码。需要用到一些标签。需要记忆
表单标签:
<form:form modelAttribute=" user" method="post" action=" "> (action的对应Controller类)
modelAttribute 就是属性绑定,一般这个绑定的都是POJO类的对象 (使得POJO类型和上传的String类型完成自动转换。)
input标签:
<form:input path="userName" />
path属性 绑定user对象 的userName属性 (user是上一个表单标签绑定的。userName其实就是POJO里面的一个属性。这样绑定,可以使得类型自动转换。)
password、textarea标签和input标签用法一样:
就是将input换成各自的类型。
<form:password path="userName" />
select标签:(在前端的学习里面,这个是下拉框)
<form:select path="XXX" items="xxx" />
或者:<form:select path="XXX" items="xxx" > <option value="XXX" >XXX</option> </form:select>
items或者说是option标签 ,都是指定 某个集合,这个集合的内容一般都是自己输入的。表示下拉框的内容。
复选框有两种标签:
checkbox标签:需要自己一个一个输入value的内容。
用法:<form:checkbox path="xxx" value="xx"/> xx 一般要写多个内容
checkboxes标签:这是一个选项组,可以把内容都放入选项组里面 (简化了代码量)
用法:<form:checkbox path="xxx" items="xx"/> items是一个集合
小结:path就是指定对应的POJO里面的属性。 items或者说value就是自己定义的某个集合或者单个内容。
实训:
实现书本P175页的应用: 使用表单实现数据绑定。
代码分析:
第一步:导入依赖。(注意,因为在userList.jsp里面用到了JSTL标签的知识,需要额外导入两个依赖:taglibs-standard-impl 、taglibs-standard-spec包)
JSTL其实就是:JSP Standard Tag Library
第二步:配置web.xml文件,和之前一样需要部署DispatcherServlet。后面还加了一个编码过滤器,防止在JSP和Controller交互数据出现中文乱码。
第三步:配置POJO、Service层、Contoller层 。方法和之前的差不多。这里主要介绍一下Controller的两个点需要注意一下,一是关于@ModelAttribute User user 相当于 = model.addAttributer("user",new User() );
但是这种用法:建议用后面一种,因为在JSP里面需要用到一个元素是modelAttribute = "user" 。这个user是POJO(User类)的对象。如果用前面一种方式,@ModelAttribute User user 。它在JSP里面获取不到user对象。
第二个点:是关于在JSP里面 有关标签库的items的值和Controller的关联。在Controller类里面有两种方式可以指定Items的值。一种在POJO用String[ ] ,这种表示的方法,需要用到HashMap<String,String> (这是键值对 关系)。一种在POJO用String表示,没有用集合表示。那么就需要在Controller里面,new String[ ]{ “”,“”,“”};
(注意后面一种方式要比前面一种要简便一些,可以减少代码量。)
第四步:配置View层。(本节知识点的重点,主要在这个JSP里面体现数据绑定的特性。)
一个是绑定表单(应对属性是Controller的 声明的POJO类的对象)
一个是${ 属性} 对应POJO类的属性。
第五步:配置Spring.mvc。和前面节的知识点配置一样。
JSON数据交互:书本P183,请看书本了解一下,用的不多,在前面也学过一点,这是一种JavaScript的应用。
总结:数据绑定的知识点用的比较多,需要重点理解。主要是绑定什么,以及对model.addAttribute(" ", new POJO() ) 的用法。
文章来源地址https://www.toymoban.com/news/detail-521708.html文章来源:https://www.toymoban.com/news/detail-521708.html
到了这里,关于JavaEE学习的第二部分的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!