MySQL
- 没有Boolean类型,默认用tinyint(1)替代,故SQL中要用数字1,不用true、false
- MySQL建模,建立关系relationship,
识别关系
是指一对多时,对于n方必须有一个1方存在,非识别关系
则反之,n方可以独立存在 - MySQL建模,建立关系,如1:n,先点击n方,再点击1方
insert into
主键重复会报错;replace into
冲突会更新;insert ignore
冲突会忽略新数据- MYSQL中触发器中不能对本表进行 insert ,update ,delete 操作,以免递归循环触发,对于update 只能用set 进行操作,insert与delete只能借助第二张表才能实现
配置问题
-
本项目共四个配置文件:
- web.xml是Tomcat服务器的配置文件,其中设置了服务器的设置项,和DispatcherServlet,指明由Spring MVC的DispatcherServlet类担任
- dispatcher-servlet.xml是配合上述DispatcherServlet设置的设置文件,在此可对其进行更详细的设置,如开启注解驱动、声明拦截器、静态资源交由Spring MVC处理、扫描包、视图解析器等
- applicationContext.xml是Spring的配置文件,由于使用Spring-MyBatis项目连接两个框架,故在此设置了数据库相关配置,如数据源、SqlSessionFactory、Mapper扫描、事务管理器、声明式事务注解驱动等
- resources中的mybatis-config.xml就是普通的mybatis配置文件,注意顺序即可,不过此处可以开启SQL打印
-
本项目中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> -
报错
java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener
:file-project structure-artifacts,右侧包全部加入WEB-INF/lib下。且新引入包后也应如此操作 -
web.xml报错
Servlet should have a mapping
:Project Structure界面,Modules>Web>Deployment descriptor,修改正确的位置即可,如果是正确位置则重新再选择一次 -
图片等静态资源获取/加载失败,F12观察到对静态资源的获取返回404:DispatcherServlet对“/”拦截,即所有请求都会被其拦截,Controller有标注的请求会被处理,但静态资源的访问Controller中没有,故404。有两个解决方法,使用默认Servlet处理静态资源访问或使用Spring MVC处理静态资源访问。在Java配置实现时,两方法并未生效(当然大概率是配置错了),故改回xml配置。两种方法均需在web(app)下建立img、css、js包,因WEB-INF下无法直接访问,也就不能访问形式引入资源 参考 参考
-
前者方法只需在dispatcher-servlet.xml中设置
<mvc:default-servlet-handler/>
,随后在web.xml中给default Servlet配置mapping的pattern<url-pattern>*.jpg</url-pattern>
即可。前者设置简单,但由于要由Spring交还给Servlet,略微影响应能(默认servlet handler或会影响其他部件,不建议用此法) -
后者要在dispatcher-servlet.xml中配置
<mvc:resources mapping="/img/**" location="/img/"/>
,此配置中mapping表示/img开头的所有请求,location表示img包下的所有文件 -
另有说resources文件夹下的资源文件可以正常获取,但未尝试
-
-
refactor,如重命名已有类,IDEA不会删除原有已编译完的class文件,需要打开out文件夹,手动删除
-
MyBatis打印SQL以调试:在mybatis-config.xml中加入。另需注意,mybatis-config.xml配置项顺序有规定
1
2
3<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings> -
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> -
sql配置的url中加入
&allowMultiQueries=true
即可在mybatis中写多个sql -
404捕获:web容器自带(web.xml中配置
<error-page>
),另也可使用spring Controller实现(具有精度优先匹配,可建立一个接受所有请求的Controller,则未被正常Controller接受的请求就会被它接受,即代表404,不过此法灵活性不高)参考 -
war exploded包和war包的区别:
- war exploded:是开发中使用的形式,将WEB工程以当前文件夹的位置关系上传到服务器,直接把文件夹、jsp页面 、classes等等移到Tomcat 部署文件夹里面,进行加载部署。因此这种方式支持热部署,一般在开发的时候也是用这种方式。绝对路径(部署位置)是项目代码内target文件夹的路径
- war:是发布模式,先打包war,再发布。将WEB工程以包的形式上传到服务器。绝对路径(部署位置)是tomcat/webapps下的路径
-
IDEA打包war包:参考
- Project Structure-Artifacts-“+”-Web Application:Archive-Empty/for‘xxx war exploded’
- 若是选择for已有war exploded,要删除自动生成的WEB-INF包,然后create Manifest在webapp下(不同IDEA版本显示不同,有的是web,不过总之是和WEB-INF同级)
- 将Available Elements中的项目名包,右键“Put Into Output Root”,此时war包目录结构下应有META-INF(manifest),WEB-INF(classes、lib、web.xml)
- apply后,build project,build Artifacts中的war,至此war打包完毕,生成路径在1中指定,默认在代码out包中
-
Tomcat运行war包:将war包放在Tomcat的webapps下,然后运行bin-startup.bat,会自动解包并启动服务。待服务器启动后,即可输入localhost:8080/war包名 访问。此时进入webapps下,也能看到解压后的项目文件夹。
-
MySQL备份:自带mysqldump工具,具体使用方法网上查阅,参考1,参考2
- 备份一个数据库,如毕设所用的college_job
mysqldump -uroot -p --databases college_job > D://college_job.sql
- 还原
mysql -uroot -p < D://college_job.sql
- 备份一个数据库,如毕设所用的college_job
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语句。
开发
-
页面中图片写法:
<img src="<%=request.getContextPath()%>/img/login_bg.jpg"/>
若用“…/…/img/xxx.jpg”,则请求实际为http://localhost:8080/img/login_bg.jpg
,没有项目名 -
多个JSP有包含include时,对主页面设置css即可,其中包含子页面的元素设置
-
即使是被包含的jsp,也应加入
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
-
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>
-
在使用form表单的时候,一旦点击提交触发submit事件,一般会使得页面跳转,页面间的跳转等行为的控制权往往在后端,后端会控制页面的跳转及数据传递,但是在某些时候不希望页面跳转,或者说想要将控制权放在前端,通过js来操作页面的跳转或者数据变化。一般这种异步的操作,我们都会想到ajax方式,因此在实现了功能后就整理了这篇文章,通过ajax方法实现form表单的提交并进行后续的异步操作。参考
form表单域ajax的post本身就是有所区别,对于页面的影响一个依赖后端、一个依赖前端。ajax中post后后端返回数据会被success函数接收,一般用于写入局部页面,以实现不刷新整个页面也能改变局部的效果。此外success的设置参考
-
Controller的参数中也可加入HttpServletRequest,自动传入,可用其进行Servlet API的操作。只是spring中不推荐使用。
-
清除session的attribute:参数
SessionStatus sessionStatus, WebRequest request
,并1
2sessionStatus.setComplete();
request.removeAttribute("user", WebRequest.SCOPE_SESSION); -
HTML 5中的input date类型,以
-
分隔,而Spring MVC动态绑定注入参数需要/
分隔,故需格式化器,在POJO的属性上@DateTimeFormat(pattern = "yyyy-MM-dd")
,或在Controller的参数中对Date类型参数声明此注解@DateTimeFormat(iso=ISO.DATE)
-
HTML的input date,格式是yyyy-MM-dd;传入后台若要获取需要util.Date,不能用sql.Date 参考说明
-
Java中util.Date不能直接sql插入库中,需要转为sql.Date,但若使用过
@DateTimeFormat
转换也可用在sql -
js Date,表示月份的参数介于0到11之间。也就是说,如果希望把月设置为8月,则参数应该是7
-
jQuery,select-option(下拉选择),要拿到选中的option的值,直接
$("#select-id").val()
即可,得到的是option的value属性的值 -
jquery中属性选择器若要使用变量选择时
$("input[id='" + applyId + "']")
-
jQuery post上传,data如要JSON则
JSON.stringify(param)
且指定contentType: "application/json"
,如传简单参数只需data: {applyId: applyId}
,甚至此处可加入多个参数,和普通post一样能被Controller接收 -
jQuery post回传,dataType指定回传内容格式,如
“json”
,此时后台要使用new ModelAndView(new MappingJackson2JsonView());
,并如mv.addObject("res", res)
为回传的json添加参数,前端拿到后在success的函数中(data){data.res}
即可访问 -
MyBatis映射器中,
<
&
会被识别为xml文件的标识,故需要转义,另外 > ` " 虽不非法但也应转义书写实体引用 符号 < < > > & & & apos; ’ & quot; " -
MyBatis-动态SQL-foreach-collection属性:若方法仅传入一个列表,则不论参数名字,此属性填入
list
;若仅传入一个数组,则不论参数名字,此属性填入array
;若列表/数组被装进map,则填入key,不需#{}
包围。参考 -
EL表达式访问对象属性时(SSM中其他类似用法同样),是调用
getXxx()
方法,故不一定需要对象有该属性,在getter中通过现有属性推出也可 -
form onsubmit属性值务必前缀return,即
onsubmit="return func()"
,否则函数执行但仍会提交
Tricks
- table背景黑,td背景白,则可实现网格划分
- form要附带其他信息一并请求,可用input,css中设置display为none