网站后台初始密码,白沙网站建设的基本情况,旅游网站怎么制作,网站后台怎么上传文件今天头一次配置成功一个SSM框架#xff0c;兴奋之余#xff0c;还应该从使用的角度#xff0c;将整个ssm配置的方法#xff0c;配置的原因#xff0c;认真的分析一下。在结束了对SSM框架简单的分析之后#xff0c;就要开始回归基础#xff0c;全面的认真复习。所以这个文…今天头一次配置成功一个SSM框架兴奋之余还应该从使用的角度将整个ssm配置的方法配置的原因认真的分析一下。在结束了对SSM框架简单的分析之后就要开始回归基础全面的认真复习。所以这个文档要尽量的完整目标就是这个文档是是对SSM框架的学习也是一个将来复习的资料。1 RESOURCES 配置文件1.1 配置文件简介这个部分用来解读在resources文件夹下的配置信息。这一部分是整个ssm框架中最难的一部分也是最复杂的一部分。在配置这个部分的时候尽管是不停的肤质粘贴偶尔改一改路径。但是这样的一个 过程要比写业务逻辑代码麻烦的多。1.1.1 jdbc.properties这个文件是用来保存和数据库连击的相关的信息比如JDBC驱动器、数据库户名、数据库密码等等和数据库相关的静态信息都会以KV的形式保存在这个文件中。这样在需要对数据库的信息进行改变时只需要打开这个文件就可以对数据库的配置进行改变。与之前传统数据库连接方式相比在修改时不用改变多处的信息。1.1.2 spring-mvc.xml和名字显示的显示的一样这是一个对MVC配置的一个文件。简单来讲有下面的几点功能1 设定用来存放controller的包的位置。2 以文件前缀、后缀的方式设定存放JSP文件的路径。我对这个文件的理解为从controller获取执行哪一个文件的信息在将这个信息通过前缀和后缀的包装传递给下一级。1.1.3 spring-mybatis.xml这个配置也常常叫做applicationContext.xml但是其实是一个东西都是用来配置mybatis。1 将标注Spring注解的类自动转化成Bean并且完成Bean的注入。2 配置数据库相关的资源。3 配置数据库的sessionFactory4 配置需要被扫描的用来存放DAO接口的接口包。5 配置事务管理器。1.1.4 UserDAO.xmlmapper.xml稍微好理解一些。就是使用DAO接口的全限定地址和DAO中的操作数据库的sql方法封装起来那么调用DAO接口的某个方法的时候就可以使用mapper.xml中封装的sql语句操作数据库。通常在这个文件也叫做mapper.xml文件.1.1.5 web.xmlxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsdversion3.1SSMSSM_testencodingFilterorg.springframework.web.filter.CharacterEncodingFilterencodingUTF-8encodingFilter/*SpringMVCorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:spring-*.xml1trueSpringMVC/index.html1.1.6 其他Logback是一个关于log日志的配置文件并没有使用sql文件夹。还有就是pom.xml文件,看起来很多其实也就是添加了几个依赖罢了。pom.xml?xmlversion 1.0 encodingUTF-8?xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd4.0.0com.xzjssmSecondTry1.0-SNAPSHOTwarssmSecondTry Maven Webapphttp://www.example.comUTF-8UTF-84.3.5.RELEASE3.4.1javaxjavaee-api7.0junitjunit4.12ch.qos.logbacklogback-classic1.2.2com.fasterxml.jackson.corejackson-databind2.8.7mysqlmysql-connector-java5.1.41runtimecom.mchangec3p00.9.5.2org.mybatismybatis${mybatis.version}org.mybatismybatis-spring1.3.1org.springframeworkspring-core${spring.version}org.springframeworkspring-beans${spring.version}org.springframeworkspring-context${spring.version}org.springframeworkspring-jdbc${spring.version}org.springframeworkspring-tx${spring.version}org.springframeworkspring-web${spring.version}org.springframeworkspring-webmvc${spring.version}org.springframeworkspring-test${spring.version}ssmSecondTryorg.apache.maven.pluginsmaven-compiler-plugin1.81.8maven-clean-plugin3.1.0maven-resources-plugin3.0.2maven-compiler-plugin3.8.0maven-surefire-plugin2.22.1maven-war-plugin3.2.2maven-install-plugin2.5.2maven-deploy-plugin2.8.2logback.xml?xml version1.0 encodingUTF-8?%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n1.2 JDBC.PROPERTIES1.2.1 代码driver com.mysql.jdbc.Driverurl jdbc:mysql://localhost:3306/mySSMusername rootpassword admin97maxPoolSize 30minPoolSize 10autoCommitOnClose falsecheckoutTimeout 10000acquireRetryAttempts 21.2.2 代码解析前面四行是我们在操作JDBC的时候常常操作的四项分别是驱动器、地址、用户名、密码。第7行设定最大连接数为30。最大连接数是连接池能申请的最大连接数。如果数据连接请求超过此数后面的数据连接请求将被加入到等待队列中这会影响之后的数据库操作。第8行设定最小连接数为10。最小连接数是连接池一直保持的数据连接。如果应用程序对数据库连接的使用量不大将会有大量的数据库连接资源被浪费掉。第9行设定在关闭之后不会自动执行commit。如果设置为true那么在数据库的连接状态关闭的时候会将没有commit的数据库操作执行commit。第10行设定连接超时时间。第11行设定失败后尝试的次数。这一个文件的设置十分明确。并且在它被读取的时候也是以键值对的形式被读取的。1.2 SPRING-MVC.XML1.2.1 代码?xmlversion 1.0 encodingUTF-8?xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:mvchttp://www.springframework.org/schema/mvcxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd1.2.2 代码解析在这样的一个文件中第111行都是环境。第14行设置存放controller的目录在这个目录下的类都会被扫描。第17行将设定模式为注解模式解析base-package目录下面带有Controller注解的类。第2327行设定这个解析的前缀和后缀前缀设定这个文件的目录后缀设定这个文件的拓展名。1.2.3 功能简析SpringMVC是View层的一部分来自于页面的信息由SpringMVC控制的Controller将请求发送到Model层中的Service中然后再Model中处理业务逻辑。从Model返回的model添加上前缀和后缀传递到View层中。所以具体的细分的话这是一个介于页面和Model层之间的模块1 将来自页面的请求传递到合适的controller。2 将从controller返回的一个jsp文件名的字符串在这里包装之后的到下一个jsp文件的全限定路径然后显示出来。当然并不是所有的controller都有返回值如果没有那就是在当前的页面修改。1.3 SPRING-MYBATIS.XML1.3.1 代码?xmlversion 1.0 encodingUTF-8?xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:txhttp://www.springframework.org/schema/txxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd1.3.2 代码解析第14行加上这一行以后将自动扫描路径下面的包如果一个类带了Service注解将自动注册到Spring容器不需要在spring-mybatis.xml文件定义bean了。类似的注解还有Component、Repository、Controller。例如有下面一个类位于com.xzj.service或其子目录中Service(xxx)Scope(yyy)publicclasstestextendsAimplementsB{······}那么就相当于在spring-mybatis.xml添加了一段这样的。......简而言之这是一个将带有注解的类添加到Spring容器的语句。第2030行创建数据库连接池读取jdbc.properties文件中的有关于数据库的设置按照这样的设置设定数据库连接池的属性。1.3.3 功能简析纵观整个项目就是这一块是最复杂的在上面的代码中第50行和第38行的bean将DAO接口和mapper连接起来。这样的配置使得在使用DAO接口的时候直接调用接口方法就可以直接调用DAO.xml中的sql语句。另外的一点就是注册了service的目录将service的内容注册到了Spring的容器中。也就是说这个这个文件配置了两个方面的内容一个是以service代表的业务逻辑一个是以DAO及其映射mapper代表的数据访问这两者共同组成了Model层。1.4 WEB.XML1.4.1 web.xml的代码?xmlversion 1.0 encodingUTF-8?xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsdversion3.1SSMSSM_testencodingFilterorg.springframework.web.filter.CharacterEncodingFilterencodingUTF-8encodingFilter/*SpringMVCorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:spring-*.xml1trueSpringMVC/index.html1.4.2 代码解析配置编码过滤器。配置分发器并且这里的分发器中注入了两个xml文件。配置welcome页面。2 MVC三层结构的简析2.1 MVC的构成2.1.1 M层M层表示Model层模型层。用来实现业务逻辑、对数据进行访问。这一层大概分为三个部分Model、Service、DAO这样的三块以我创建的这个工程来讲三个部分分别是1 User类这个类中有三个属性分别有他们的get、set方法。2 Service接口及其实现类。在spring-mybatis.xml中配置从而被扫描。3 UserDAO接口在spring-mybatis.xml中配置与UserDAO.xml配对被动态实现。即:这层的三个模块都是在spring-mybatis.xml中被配置的。2.1.2 V层V层表示View层显示层。是用来和用户交互的可视化界面如html和jsp文件在浏览器中的显示。同样在这些显示页面中可以设定不同的请求根据不同的前端动作提交给分发器。那么这样的到的响应也不同。2.1.3 C层C层表示Controller控制器。C层大致上有两种功能1 根据不同的请求调用M层中不同业务逻辑处理。2 得到了来自M层处理结果的返回给予V层的显示结果也不相同。这一块是在spring-mvc.xml配置的。2.2 M层的具体构成2.2.1 简述M层是Model层负责业务逻辑和数据访问。以这个项目为例子除了controller 以外的Java类和接口都是属于Model层的的除此之外还有UserDAO.xml也是属于Model层的。2.2.2 User类User的代码如下packagecom.xzj.model;// author :zjxu time:2018/12/31publicclassUser{privateintuserID;privateStringuserName;privateStringuserPassword;privateStringcomments;publicintgetUserID() {returnuserID;}publicStringgetUserName() {returnuserName;}publicStringgetUserPassword() {returnuserPassword;}publicStringgetComments() {returncomments;}publicvoidsetUserID(intuserID) {this.userIDuserID;}publicvoidsetUserName(StringuserName) {this.userNameuserName;}publicvoidsetUserPassword(StringuserPassword) {this.userPassworduserPassword;}publicvoidsetComments(Stringcomments) {this.commentscomments;}OverridepublicStringtoString() {returnUser{userIDuserID, userNameuserName\, userPassworduserPassword\, commentscomments\};}}言简意赅这一段代码就是定义一个User类并且定义了几个域。id、name、password、comments。设定了它们的getter和setter。2.2.3 UserService接口packagecom.xzj.service;importcom.xzj.model.User;// author :zjxu time:2018/12/31publicinterfaceUserService{publicUserselectUser(longuserID);}申明一个接口这个接口是Model层中的service的接口。它的实现类必须实现在这个类中定义的方法。其实这个接口并不是必须的在spring-mybatis.xml中配置的com.xzj.service目录中直接写UserServiceImple类即可将这个类配置进spring中。但是有这个过接口可以将Model层中的service服务的结构更加清晰。所以在这个工程中就使用了UserService接口。2.2.4 UserServiceImple 类packagecom.xzj.service.imple;// author :zjxu time:2018/12/31importcom.xzj.DAO.UserDAO;importcom.xzj.model.User;importcom.xzj.service.UserService;importorg.springframework.stereotype.Service;importjavax.annotation.Resource;Service(userService)publicclassUserServiceImpleimplementsUserService{ResourceprivateUserDAOuserDAO;publicUserselectUser(longUserID) {returnthis.userDAO.selectUser(UserID);}}UserService的实现类其中两个很重要的是两个注解11和14行的两个注解。 第11行的注解Service(userService”)表示是为userService服务的这个userService是controller的userService类。2.2.5 UserDAO 接口packagecom.xzj.DAO;// author :zjxu time:2018/12/31importcom.xzj.model.User;publicinterfaceUserDAO{UserselectUser(longid);}2.2.5 UserDAO.xmlmapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtdSELECT * FROM userList WHERE userID #{id}2.3 C层的具体构成2.3.1 简述C层就是 controller位于Model层和View层之间的一层。2.3.2 Controller 类packagecom.xzj.controller;// author :zjxu time:2018/12/31importcom.fasterxml.jackson.databind.ObjectMapper;importcom.xzj.model.User;importcom.xzj.service.UserService;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.servlet.ModelAndView;importjavax.annotation.Resource;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;ControllerpublicclassUserController{ResourceprivateUserServiceuserService;RequestMapping(/showUser.do)publicvoidselectUser(HttpServletRequestrequest,HttpServletResponseresponse,ModelAndViewmav) throwsIOException{request.setCharacterEncoding(UTF-8);response.setCharacterEncoding(UTF-8);longuserIdLong.parseLong(request.getParameter(id));Useruserthis.userService.selectUser(userId);System.out.println(\n\n\n\n\n\n\n\n\n\n\n\nuserId\n\n\n\n\n\n\n\n\n\n\n\n);ObjectMappermappernewObjectMapper();response.getWriter().write(mapper.writeValueAsString(user));response.getWriter().close();}RequestMapping(/test)publicModelAndViewtest(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{ModelAndViewmavnewModelAndView();mav.addObject(name, SpringMVC);mav.setViewName(test);returnmav;}}2.3.3 Controller层注解的详细分析在controller中重要的地方在于这几个注解。controller、Resource、RequestMapping这单个注解。1 注解Controller。表明这是一个Controller类spring-mvc.xml文件设定的扫描目录下被扫描。2 注解Resource。这个注解放在UserService的申明的前一行。它声明一个名为userService的对象并且这个对象的类型为UserService接口的实现类。通过Resource注解可以在service目录下UserServiceImple类中找到带有一个Service(userService”)的注解找到的注解中的变量名和这个注解下一行声明的对象的变量名是一致的。在service目录下找到的那个类前面的注解表明在controller中的申明的对象的具体类型的UserServiceImple它实现了UserService这个接口。也就是说Service(“userService”)注解的类为Resource下一行的名为userService的对象服务。而它们一个位于service目录下一个位于controller目录下。这两个目录都被添加到了spring-*.xml中。这样的对应关系是属于两个层的3 注解RequestMapping参数类型为一个字符串。这个参数的意义是从controller来的除了项目以外的三级及以下的URL地址。比如http://localhost:8080/ssm/test这样的一个地址经过分发器来到了controllercontroller会根据除了localhost/ssm/之外的地址调用不同的方法。在controller这端就会将后面的这段url地址通过注解标记在方法上或者是类上面。以这个url来看它就会调用UserController.test(request,response)方法。注解的位置的区别在于1 类的上方没有注解的时候这个类的下面所有的方法的注解都需要添加参数。当然也不是所有的方法都需要有注解。但是只要是存在的注解都需要有参数。否则这样写的controller方法作出的效果将会是“localhost:8080/ssm”的结果这样welcome页面将会失效。2 类的上方存在注解那么这个注解会成为这个一个上级字符串加在类中的方法上的字符串上。就如同java的package的目录一样。com.xzj.test这样子只不过在这里是用’/’来连接。2.4 V层的具体构成V层是直接面对用户的页面。所以在V层中写的代码都是面向用户的操作的尽管有一部分和请求相关但是绝大部分还是于页面的展示相关的。2.4.1 index.html文件htmltestfunctionselectUser() {varxmlhttpnewXMLHttpRequest();xmlhttp.onreadystatechangefunction() {if(xmlhttp.readyState4xmlhttp.status200) {document.getElementById(test).innerHTMLxmlhttp.responseText;}}xmlhttp.open(POST, showUser.do, true);xmlhttp.setRequestHeader(Content-type, application/x-www-form-urlencoded);xmlhttp.send(id100);}Hello World!onclick testThisIsALinkForTest这段html代码其中的重点在于javascript代码中的Ajax掌握。这段短短的javascript发起请求获得响应设定显示完成这三个工作。按钮-响应这一块非常基础的前端应用主要的问题来自于响应方法中的Http请求。关于javascript的代码逻辑虽然一眼就能明了但是还是要仔细研究一下ajax如何在html文件中更加精巧的应用。对于这个连接就是在点击之后会跳转到显示/WEB-INF/views/test.jsp相当于一个请求controller并通过controller的到一个“test”的字符串将其包装成为了一个完整的路径在View层显示。2.4.2 jsp目录及其下的test.jsp文件CreatedbyIntelliJIDEA.User: thisxzjDate: 2019/1/1Time: 23:45TochangethistemplateuseFile|Settings|FileTemplates.--%xxxtest我新建的项目是${name}这个jsp的路径是/WEB-INF/views/test.jsp在从controller中返回一个字符串比如一个“test”串或者是modelAndView.setViewName(test”),并将其返回。就会通过spring-mvc.xml中的下两行将其包装成/WEB-INF/views/test.jsp。并将其显示到页面中。在这样一个jsp页面中${name}这个变量是通过controller类中以返回modealAndView的方式在modelAndView对象modelAndView.addObject(name, SpringMVC);那么在jsp页面中将会读取这个KV将name显示为成“SpringMVC”。这样就完成了一个从后台向前台的传输的过程。响应过程1 用户在浏览器窗口输入一个URL地址以localhost:8080/ssm/为例子由于这个URL是直接localhost/ssm/后面并没有接更多的信息就会直接显示在web.xml中设定的welcome页面index.html。 这个过程发生在View层。2 于是在浏览器页面上就会显示index.html的内容。用户按下显示onclick test的按钮通过javascript的ajax发送一个包含一个字符串“showUser.do”和一个KV对“id 1”的一个请求到controllercontroller再根据请求中的“showUser.do”调用对应的controller方法。 这个过程从View层到Controller层。3 请求来到Cotroller通过扫描在Spring-MVC.xml中配置的目录下的所有的Java类。找到这个目录下所有带有Controller的类。在这些类中寻找“showUser.do”对应的方法。在Controller类的第24行找到了一个selectUser方法。那么就会执行这个方法对来自View层的请求进行响应。这个过程发生在Controller层。4 找到这个方法了开始执行。这个方法的核心在于使用了userService这个对象以及它的的方法。关于如何使用的在2.3.3中有详细的解释。在在这个类中使用这个对象以及它的seclectUser方法就是工作从Controller层到Model层的转移。5 来到Model层映入眼帘的就是Service接口的实现类ServiceImple。我们不关注Service接口经过我的测试去掉这个接口对程序的运行也没有影响。但是这个接口的存在可以使Service方法更加规范化。在大型工程中有一个这样的接口可以更加规范。在这个ServiceImple类中申明了一个UserDAO的对象这个对象并没有实体。通过注解将UserDAO.xml作为这个接口的实体使用定义在UserDAO.xml中的sql语句操作数据库。sql语句和UserDAO的对应通过在spring-mybatis.xml中将mapper的目录和DAO接口的目录配置进去。这样在mapper的xml中声明是对哪一个DAO接口的实现并且在每一个sql方法的标签内设置id为对应的DAO接口中的方法名就可以视作将DAO的方法在mapper的xml中实现了。通过目录、接口名、方法名的一系列配置在调用UserDAO接口的方法的时候就可以直接使用对应的sql语句。以Useruserthis.userService.selectUser(userId);然后在UserServiceImple中调用UserDAO的方法this.userDAO.selectUser(UserID);在通过DAO的配置使用UserDAO.xml中的sql语句操作数据库。这个部分的操作都是在Model层。但是将Model层分为两个模块service和DAO的话那么这个部分是在Model层中是从service到DAO的转移。6 我们忽略mapper的xml文件中具体执行了什么。只考虑对数据库操作之后有没有数据的返回。如果没有那么一个从前到后的SSM请求到响应就已经结束了。大多数时候是有返回的。通过mapper的xml文件中的result设定的返回值类型将从数据库中获取的数值包装成一个返回类型返回给UserServiceImple的对象。在这个例子中是从数据库中获取指定id处的一个User对象的所有信息将其包装成一个User对象返回给UserServiceImple。这个部分的操作都是在Model层细分的话那么这个部分是在Model层中是从DAO到service的转移。7 UserServiceImple对象将从DAO获得了一个User对象的返回值返回给Controller层。这一个操作是从Model层返回到Controller层。8 这样的一个User对象从DAO、Service传递了Controller层中由“showUser.do”对应的那个方法中继续着下一步的操作。通过下面两行语句将获取的User对象转换成一个字符串然后传送到javascript代码中请求所对应的响应码responseText中。ObjectMappermappernewObjectMapper();response.getWriter().write(mapper.writeValueAsString(user);然后通过DOM操作将html中的某个字段修改成User对象的字符串形式。完成了获取内容在页面上的显示。这一步是从Controller层到View层的传递。