MySQL

  1. 没有Boolean类型,默认用tinyint(1)替代,故SQL中要用数字1,不用true、false
  2. MySQL建模,建立关系relationship,识别关系是指一对多时,对于n方必须有一个1方存在,非识别关系则反之,n方可以独立存在
  3. MySQL建模,建立关系,如1:n,先点击n方,再点击1方
  4. insert into 主键重复会报错;replace into冲突会更新;insert ignore 冲突会忽略新数据
  5. MYSQL中触发器中不能对本表进行 insert ,update ,delete 操作,以免递归循环触发,对于update 只能用set 进行操作,insert与delete只能借助第二张表才能实现

 

配置问题

  1. 本项目共四个配置文件:

    1. web.xml是Tomcat服务器的配置文件,其中设置了服务器的设置项,和DispatcherServlet,指明由Spring MVC的DispatcherServlet类担任
    2. dispatcher-servlet.xml是配合上述DispatcherServlet设置的设置文件,在此可对其进行更详细的设置,如开启注解驱动、声明拦截器、静态资源交由Spring MVC处理、扫描包、视图解析器等
    3. applicationContext.xml是Spring的配置文件,由于使用Spring-MyBatis项目连接两个框架,故在此设置了数据库相关配置,如数据源、SqlSessionFactory、Mapper扫描、事务管理器、声明式事务注解驱动等
    4. resources中的mybatis-config.xml就是普通的mybatis配置文件,注意顺序即可,不过此处可以开启SQL打印
  2. 本项目中mapper文件均放在了src-java下。但IDEA不会自动编译src-java下的xml文件,故会导致找不到mapper文件。解决:maven的pom.xml中,根节点内添加以下代码,表示将xml文件一并编译:(将mapper.xml放在resources会一同编译但mybatis配置文件中如何书写mapper设置?)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <build>
    <resources>
    <resource>
    <directory>src/main/java</directory>
    <includes>
    <include>**/*.xml</include>
    </includes>
    </resource>
    </resources>
    </build>
  3. 报错java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener:file-project structure-artifacts,右侧包全部加入WEB-INF/lib下。且新引入包后也应如此操作

  4. web.xml报错Servlet should have a mapping:Project Structure界面,Modules>Web>Deployment descriptor,修改正确的位置即可,如果是正确位置则重新再选择一次

  5. 图片等静态资源获取/加载失败,F12观察到对静态资源的获取返回404:DispatcherServlet对“/”拦截,即所有请求都会被其拦截,Controller有标注的请求会被处理,但静态资源的访问Controller中没有,故404。有两个解决方法,使用默认Servlet处理静态资源访问或使用Spring MVC处理静态资源访问。在Java配置实现时,两方法并未生效(当然大概率是配置错了),故改回xml配置。两种方法均需在web(app)下建立img、css、js包,因WEB-INF下无法直接访问,也就不能访问形式引入资源 参考 参考

    1. 前者方法只需在dispatcher-servlet.xml中设置<mvc:default-servlet-handler/>,随后在web.xml中给default Servlet配置mapping的pattern<url-pattern>*.jpg</url-pattern>即可。前者设置简单,但由于要由Spring交还给Servlet,略微影响应能(默认servlet handler或会影响其他部件,不建议用此法)

    2. 后者要在dispatcher-servlet.xml中配置<mvc:resources mapping="/img/**" location="/img/"/>,此配置中mapping表示/img开头的所有请求,location表示img包下的所有文件

    3. 另有说resources文件夹下的资源文件可以正常获取,但未尝试

  6. refactor,如重命名已有类,IDEA不会删除原有已编译完的class文件,需要打开out文件夹,手动删除

  7. MyBatis打印SQL以调试:在mybatis-config.xml中加入。另需注意,mybatis-config.xml配置项顺序有规定

    1
    2
    3
    <settings>
    <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>
  8. Spring设置post中文乱码:web.xml设置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <!-- 配置SpringMVC设置编码方式的过滤器 -->
    <filter>
    <filter-name>encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>utf-8</param-value>
    </init-param>
    <init-param>
    <param-name>forceRequestEncoding</param-name>
    <param-value>true</param-value>
    </init-param>
    <init-param>
    <param-name>forceResponseEncoding</param-name>
    <param-value>true</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
  9. sql配置的url中加入&allowMultiQueries=true即可在mybatis中写多个sql

  10. 404捕获:web容器自带(web.xml中配置<error-page>),另也可使用spring Controller实现(具有精度优先匹配,可建立一个接受所有请求的Controller,则未被正常Controller接受的请求就会被它接受,即代表404,不过此法灵活性不高)参考

  11. war exploded包和war包的区别:

    1. war exploded:是开发中使用的形式,将WEB工程以当前文件夹的位置关系上传到服务器,直接把文件夹、jsp页面 、classes等等移到Tomcat 部署文件夹里面,进行加载部署。因此这种方式支持热部署,一般在开发的时候也是用这种方式。绝对路径(部署位置)是项目代码内target文件夹的路径
    2. war:是发布模式,先打包war,再发布。将WEB工程以包的形式上传到服务器。绝对路径(部署位置)是tomcat/webapps下的路径
  12. IDEA打包war包:参考

    1. Project Structure-Artifacts-“+”-Web Application:Archive-Empty/for‘xxx war exploded’
    2. 若是选择for已有war exploded,要删除自动生成的WEB-INF包,然后create Manifest在webapp下(不同IDEA版本显示不同,有的是web,不过总之是和WEB-INF同级)
    3. 将Available Elements中的项目名包,右键“Put Into Output Root”,此时war包目录结构下应有META-INF(manifest),WEB-INF(classes、lib、web.xml)
    4. apply后,build project,build Artifacts中的war,至此war打包完毕,生成路径在1中指定,默认在代码out包中
  13. Tomcat运行war包:将war包放在Tomcat的webapps下,然后运行bin-startup.bat,会自动解包并启动服务。待服务器启动后,即可输入localhost:8080/war包名 访问。此时进入webapps下,也能看到解压后的项目文件夹。

  14. MySQL备份:自带mysqldump工具,具体使用方法网上查阅,参考1参考2

    1. 备份一个数据库,如毕设所用的college_job mysqldump -uroot -p --databases college_job > D://college_job.sql
    2. 还原 mysql -uroot -p < D://college_job.sql

 

SSM配置

(1)web.xml是Tomcat服务器所用的配置文件。在此配置了欢迎页属性welcome-file-list,指定登陆页面文件作为欢迎页,如此便可在输入地址时只输入到项目名称,就可显示登陆页面,无需在地址中后缀特别的字段以表示要访问登陆页面。

(2)web.xml中设置了一个作用于所有请求的过滤器filter,它采用Spring MVC框架中的CharacterEncodingFilter类作为过滤器类,能将请求的编码方式过滤,改为支持中文的编码方式。在此设置之后,所有页面就无需设置,简单方便。

(3)web.xml中设置了错误页面error-page,404页面就是在此设置,为404错误绑定了专属页面。当发生404错误时,就会以该页面返回显示。

(4)web.xml中设置了最重要的Servlet——DispatcherServlet,使用的是Spring MVC中的DispatcherServlet类,作用于所有请求。如此便可实现所有请求首先由该类捕获,然后分发给对应的控制器处理。

(5)dispatcher-servlet.xml是配合上述DispatcherServlet的一个配置文件,其中对DispatcherServlet进行了更详细的配置。在此指明了本系统Spring框架开启注解驱动,如此,在代码中就可以使用注解方便地进行设置。

(6)dispatcher-servlet.xml中配置了拦截器interceptors,其作用是声明拦截器类,和类要拦截的请求。本系统用此方法实现了权限分隔。在用户使用系统时,每次发起新的请求,被控制器捕获前都会先经过拦截器处理,判断当前用户是否有权限进行接下来的操作。若当前会话内尚无登陆用户信息,就跳转到登陆页面;若当前用户并无进行操作的权限,就跳转至该用户主页,不进行接下来的操作;若用户拥有权限,操作与用户身份匹配,就正常进行后续操作。

(7)dispatcher-servlet.xml中配置使用Spring MVC处理静态资源访问。如CSS、JavaScript、图片等静态资源,都是单独开启一次访问请求获取,但所有请求已被DispatcherServlet和控制器获取,并无针对静态资源的方法。这就会导致静态资源的获取404。配置resources,指定URL与后端静态资源文件存放路径,就可使针对这些静态资源的访问改由Spring MVC处理,便能正常返回给前端。

(8)dispatcher-servlet.xml中配置视图解析器Bean,使用Spring MVC的InternalResourceViewResolver类。配置项中的前缀可用于指定页面所在包,后缀可指定页面文件格式。配置后即可实现在控制器中指定视图时,直接写出视图文件名即可,系统会自动加上配置过的前后缀寻找到视图文件绑定数据并返回。

(9)applicationContext.xml是Spring框架所需的配置文件,本系统使用Spring-MyBatis项目作为Spring与MyBatis的桥梁,使MyBatis能在Spring环境下运行。在此配置文件中指明了数据库相关的设置,如数据源、事务管理器、声明注解驱动等。

(10)applicationContext.xml中设置数据源URL时,本系统开启了allowMultiQueries,声明MyBatis和MySQL支持一个方法执行多条SQL语句。

 

开发

  1. 页面中图片写法:<img src="<%=request.getContextPath()%>/img/login_bg.jpg"/> 若用“…/…/img/xxx.jpg”,则请求实际为http://localhost:8080/img/login_bg.jpg,没有项目名

  2. 多个JSP有包含include时,对主页面设置css即可,其中包含子页面的元素设置

  3. 即使是被包含的jsp,也应加入<%@ page contentType="text/html;charset=UTF-8" language="java" %>

  4. webjars,使用jQuery时遇到,本项目中xml静态资源配置为

    1
    2
    <!--<mvc:resources mapping="/webjars/**" location="classpath:/META-INF/resources/webjars/"/>-->
    <mvc:resources mapping="/webjars/**" location="/webjars/"/>

    jsp引用为 <script src="<%=request.getContextPath()%>/webjars/jquery/3.6.0/dist/jquery.js"></script>

  5. 在使用form表单的时候,一旦点击提交触发submit事件,一般会使得页面跳转,页面间的跳转等行为的控制权往往在后端,后端会控制页面的跳转及数据传递,但是在某些时候不希望页面跳转,或者说想要将控制权放在前端,通过js来操作页面的跳转或者数据变化。一般这种异步的操作,我们都会想到ajax方式,因此在实现了功能后就整理了这篇文章,通过ajax方法实现form表单的提交并进行后续的异步操作。参考

    form表单域ajax的post本身就是有所区别,对于页面的影响一个依赖后端、一个依赖前端。ajax中post后后端返回数据会被success函数接收,一般用于写入局部页面,以实现不刷新整个页面也能改变局部的效果。此外success的设置参考

  6. Controller的参数中也可加入HttpServletRequest,自动传入,可用其进行Servlet API的操作。只是spring中不推荐使用。

  7. 清除session的attribute:参数SessionStatus sessionStatus, WebRequest request,并

    1
    2
    sessionStatus.setComplete();
    request.removeAttribute("user", WebRequest.SCOPE_SESSION);
  8. HTML 5中的input date类型,以-分隔,而Spring MVC动态绑定注入参数需要/分隔,故需格式化器,在POJO的属性上@DateTimeFormat(pattern = "yyyy-MM-dd"),或在Controller的参数中对Date类型参数声明此注解@DateTimeFormat(iso=ISO.DATE)

  9. HTML的input date,格式是yyyy-MM-dd;传入后台若要获取需要util.Date,不能用sql.Date 参考说明

  10. Java中util.Date不能直接sql插入库中,需要转为sql.Date,但若使用过@DateTimeFormat转换也可用在sql

  11. js Date,表示月份的参数介于0到11之间。也就是说,如果希望把月设置为8月,则参数应该是7

  12. jQuery,select-option(下拉选择),要拿到选中的option的值,直接$("#select-id").val()即可,得到的是option的value属性的值

  13. jquery中属性选择器若要使用变量选择时 $("input[id='" + applyId + "']")

  14. jQuery post上传,data如要JSON则JSON.stringify(param)且指定contentType: "application/json",如传简单参数只需data: {applyId: applyId},甚至此处可加入多个参数,和普通post一样能被Controller接收

  15. jQuery post回传,dataType指定回传内容格式,如“json”,此时后台要使用new ModelAndView(new MappingJackson2JsonView());,并如mv.addObject("res", res)为回传的json添加参数,前端拿到后在success的函数中(data){data.res}即可访问

  16. MyBatis映射器中,< &会被识别为xml文件的标识,故需要转义,另外 > ` " 虽不非法但也应转义书写

    实体引用 符号
    &lt; <
    &gt; >
    &amp; &
    & apos;
    & quot; "
  17. MyBatis-动态SQL-foreach-collection属性:若方法仅传入一个列表,则不论参数名字,此属性填入list;若仅传入一个数组,则不论参数名字,此属性填入array;若列表/数组被装进map,则填入key,不需#{}包围。参考

  18. EL表达式访问对象属性时(SSM中其他类似用法同样),是调用getXxx()方法,故不一定需要对象有该属性,在getter中通过现有属性推出也可

  19. form onsubmit属性值务必前缀return,即onsubmit="return func()",否则函数执行但仍会提交

 

Tricks

  1. table背景黑,td背景白,则可实现网格划分
  2. form要附带其他信息一并请求,可用input,css中设置display为none