JavaEE学习的第二部分

第一部分:主要学习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()  )  的用法。

猜你喜欢

转载自blog.csdn.net/qq_55928086/article/details/131455755