说明:包含jquery和html部分知识点。
后端部分
中文乱码
首先要明确环境,win10(本人操作系统语言:the United Kingdom),jdk14,tomcat9,ideal2020.3,谷歌浏览器
乱码这个问题说大不大,说小不小,这几天被乱码弄得有点崩溃。下面来看看吧。
servlet乱码
添加修改值中文乱码
描述:操作数据库向数据库添加值,修改值均出现乱码,查询数据库确为乱码,应该是添加的时候就出问题了,所以我用了注解设置编码方式,但很可惜没有生效。
尝试1:在对应的servlet上添加注解,是我创建servlet时就做的。可见没有起效。
@WebServlet(urlPatterns = {"/login"}, loadOnStartup = 1, initParams = {
@WebInitParam(name = "code", value = "utf-8")
})
尝试2:在对应servlet方法中先设置编码方式
//用于post提交,但加入到过滤器可以是所有servlet乱码得到解决
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
该尝试解决了添加问题,但是没有解决修改出现的乱码,于是我做了下面的尝试。
尝试3:接受参数时,为每一个参数单独设置指定编码格式
String name=new String(request.getParameter("uname").getBytes("ISO-8859-1"),"UTF-8");
修改部分依旧是有乱码,我就是在这里被卡住了,网上也搜了不少资料,都没能解决。
尝试4(此方法不推荐,后续我已撤销对tomcat配置文件修改):更改tomcat配置文件。在tomcat的安装目录下找到conf/server.xml文件,打开,修改以下部分:
<Connector port=“8080” protocol=“HTTP/1.1”
connectionTimeout=“20000”
redirectPort=“8443”/>
在后面加上
URIEcoding=“UTF-8”
添加部分的解决了,但是修改依旧乱码。
解决:移除尝试3的指定转码,保留尝试2的语句,即可解决。
原因分析:我心急了,之前添加指定格式时,并没有立即尝试而是按照文档直接追加尝试3语句,发现不行后并未全部移除,而我没有移除的恰恰是我在一直拿来测试的,如果我用下面的其他字段测试,应该早就发现了。
Filter的init()等方法中控制台打印出乱码
描述:我在实现Filter接口后覆写init()方法时,在内追加一个普通控制台输出语句,中文部分全部显示问号,同样的,doFilter()和destroy()方法中一样。
代码:
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init过滤器初始化");
}
思考:我想了好久,实在是不知道为什么!之前用ideal输出中文没有问题啊。怎么现在出问题了。
尝试1:我在出问题的类的同路径下新建了一个类用于测试,main方法中只有一个输出语句,输出中文,并没有问题,中文正常输出。我就很纳闷了,为毛?
尝试2:重新编译整个项目,清楚缓存重启ideal,尝试,结果和尝试1一致。
尝试3:网上都说改成UTF-8就没有问题,我也知道,于是通过ideal中File
→
\rightarrow
→ setting
→
\rightarrow
→ 搜索File encoding 修改项目和配置文件的编码方式:
如图:
我修改了红色和紫色部分,由于全局编码就是UTF-8我就没有动了。下面的红圈是配置文件,上面的红圈是项目的编码方式。运行tomcat,还是乱码。
尝试4:突然想到查查看当前编码是什么。不然怎么可能一直不对呢?于是我在init()方法中加入了:
System.out.println(System.getProperty("file.encoding"));
输出结果为cp1252,我一边搜这个编码一边就想到了我的操作系统是英文的,应该是这么引起的。果然west European西欧,唔。自己坑自己我认了。于是搜索如何更改环境编码方式,作出如下更改:
ideal菜单 Help
→
\rightarrow
→ Edit custom VM options…
→
\rightarrow
→ 追加
-Dfile.encoding=utf-8
→
\rightarrow
→ 编辑tomcat配置,追加同样语句:
完美解决,中文真美。
关于乱码的博客我发现有一篇写的不错,收藏一下
乱码问题
页面样式失效
加入过滤器后页面失效
此问题经过测试后发现是我把css,js等文件并没有放行,所以导致无法访问。在过滤器中设置中允许该类文件加载即可。
这是我过滤器的写法,当然可以按照自己的方式写,我认为一般以.js .css结尾就可以了,我这练习用。
package com.hllg.curriculum.utils.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author HLLG
* @version 1.0
* @time 2021/03/05 Fri 12:02
*/
public class InitFilter implements Filter {
private String encoding = null;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println(System.getProperty("file.encoding"));
System.out.println("init过滤器初始化");
encoding = filterConfig.getInitParameter("encoding");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("init过滤器开始工作");
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//处理所有servlet乱码
if (encoding != null) {
request.setCharacterEncoding(encoding);
response.setContentType("text/html;charset=" + encoding);
}
String user = (String) request.getSession().getAttribute("user");
String uri = request.getRequestURI();
System.out.println(uri);
//设置资源放行,指定资源可以在未登录的情况下访问,或者有session的情况下
if (uri.endsWith("/index.jsp") || uri.endsWith("/login") || uri.endsWith("/") || uri.contains("/js/") || uri.contains("/css/") || uri.contains("/img/") || user != null) {
//进入下一个Filter或者servlet
System.out.println("通过pass");
filterChain.doFilter(servletRequest, servletResponse);
} else {
System.out.println("被拦截failed");
response.sendRedirect("/index.jsp");
}
}
@Override
public void destroy() {
System.out.println("init过滤器销毁");
encoding = null;
}
}
以下是配置文件,我设置的是过滤所有。请按需更改。请只参考含有注释的代码,剩下为其他过滤器配置。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--初始化过滤start-->
<filter>
<filter-name>init</filter-name>
<filter-class>com.hllg.curriculum.utils.filter.InitFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>init</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--初始化过滤end-->
<filter>
<filter-name>downloadCheck</filter-name>
<filter-class>com.hllg.curriculum.utils.filter.DownloadCheckFilter</filter-class>
<init-param>
<param-name>minDownloadCredit</param-name>
<param-value>100</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>downloadCheck</filter-name>
<url-pattern>/download/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>wordsCheck</filter-name>
<filter-class>com.hllg.curriculum.utils.filter.WordsCheckFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>wordsCheck</filter-name>
<url-pattern>/addCriticism</url-pattern>
</filter-mapping>
</web-app>
已上得到解决。
浏览器控制台的Resource interpreted as Stylesheet but transferred with MIME type text/html
浏览器调试出现如下问题:
解决:请删除jsp页面的中h5的头部声明,即可。
但是啊,贸然删去头部声明怎么想都不符合规范,不推荐怎么做。我查阅了写参考资料,可能是我文档内部有不符合规范的语句,但我没有检查了。
参考资料:
参考该文档第8点
关于DOCTYPE声明
过度文档
缓存问题引起的页面样式失效
请注意,到这一步,请确保你的css,js不存在任何语法,逻辑错误,且用浏览器调试工具加载正常,也就是上面提到的过滤器并没有拦截静态资源文件。查看方式,加载页面后按F12,
之后按图中红色描述即可。
刷新页面,重复添加值
描述:我的添加按钮(实际为a标签)绑定到了一个servlet,提交后由于js脚本不响应(下一个问题),导致页面没有跳转,是空白页,我手动刷新时发现,他又添加了一个相同的数据(该数据内没有唯一、主键等约束所以数据库可以重复添加)。所以认为是刷新会导致重新发送请求,servlet必然会再次响应。
解决:独立出一个添加的servlet处理完成后无论是否成功跳转页面或响应js事件跳转,不可造成重复调用servlet。
response.getWriter().print()向页面输出脚本不响应
单独script标签内一句弹窗不响应
描述:我想把结果用弹窗作为提示,所以需要向页面写入一个脚本,来提示用户,但是数据确实都达到效果了,唯独弹框不响应。
解决:将跳转也用js脚本做即可。
原因:因为我在这之后做了response.sendRedirect(),所以页面脚本不响应。
调用函数不响应
描述:我想调用一个外部js函数,所以在script标签内直接写函数名,但是不响应,谷歌浏览器调试提示该函数没有定义。
尝试:更改调用格式,不行;更改外部函数为页面内部函数,依旧提示找不到该函数;
解决:直接在print()参数内写整个方法体,并传入参数。
获取ResultSet中类型为Date的日期和时间
描述:我从数据库时间都是带日期和时分秒的,页面jsp也用了fmt标签,但是时分秒显示一直全为0,调试后发现POJO存值没有问题,但是从结果集中取值出现了问题。
解决:应该是调用方法没选对,查阅资料后总结如下:
获取日期:
resultSet.getDate();
获取时间:
result.getTime();
获取日期和时间:
result.getTimestamp();
jsp页面中获取一个集合的长度
方法一:${list.size()} list为后台存入域中名称
方法二:${fn:length(list)} 需要引入标签库<%@ taglib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions” %>
设置数据库一个字段最低值为0
描述:用户表里有个积分,只有符合条件才有权限下载,可以发现,我的积分出现了负值,我需要限制我的积分字段的最低值为0.
思考:一开始我居然想在数据库中写约束,唔。后来又想到了无符号数,但是我要的扣除积分后值大于等于0,我就想到了事务,先去修改之后再去查询是否小于0,这样需要手动提交,我花了点时间,写出来了,但是下载后并没有扣除积分。积分一直没有变,因为我在同一个事务里修改后查询,但是你这事务不提交怎么会查到修改的结果呢?后来突然发现,我想复杂了。
解决:直接在dao层写个方法查出用户积分,然后减去下载资源所需资源大于等于0不就好了!真实,愚蠢!
前端部分
input标签date赋值问题
描述:h5新增< input type=date>类型,我从后台取到了值,赋值给对应的value属性,但是一直没有赋上去。
尝试:我手动给input框的value值赋值,发现没有问题,于是调试,发现jquery传来的值也没有问题(查到的值显示在表格,我用jquery将表格里单元格的值赋值给模态框以方便用户修改),可是为什么不显示呢?我突然想到可能字符串格式化出了问题,于是我在取出来的值后面加了trim()方法,果然解决了。记录一下。
解决:在调用的jquery的值后面增加trim()方法。
代码如下:
function evaluation(obj, id) {
var tds = $(obj).parent().parent().find("td");
$("#cuid").val(id);
$("#cuName").val($(tds.eq(1)).text());
$("#cuPrice").val($(tds.eq(2)).text());
$("#cuInfo").val($(tds.eq(3)).text());
$("#cuNum").val($(tds.eq(4)).text());
$("#cuPeriod").val($(tds.eq(5)).text());
// 获取不到是因为没有去除首尾空格
$("#cuStartTime").val($(tds.eq(6)).text().trim());
$("#cuEndTime").val($(tds.eq(7)).text().trim());
//测试用
console.log($(tds.eq(6)).text());
}
关于jquery的函数
所有函数调用请自己加选择器,以下示例直接写方法,后续方法取决于各自需求。
on(event, function(){})
请注意该参数列表不完整,我只使用到该列表,其实event为必须,剩下为可选。参考
为指定元素绑定事件,对于动态生成的元素也可以生效,比如我页面加载完我用脚本添加了一行,而该行带有的删除需要此方法绑定事件才可以生效,之前绑定的事件对于脚本生成的元素不起作用。
我目前使用到的参数:(event , function())
event绑定事件,匿名函数用来指定触发事件后的操作
find(“element”)
找到指定选择器所有后代满足参数的元素,例如find(“span”)
如要返回直接子元素,请使用children()方法
eq(index)
或者是直接选择器中 $(":eq(index)") 注意冒号,冒号前放指定选择器,例如p元素选择器等
index从0开始
js函数调试
ideal中:配置tomcat时,勾选javascript调试
浏览器中:打开调试工具,选择需要调试的代码,左边打断点,上方控制程序运行
代码中:在需要调试的地方加入debugger关键字即可。
写给自己:
1.遇到的问题都不难,不要形成依赖;
2.要学会自己动脑子,静下心,不要急 仔细捋一遍,网上搜搜(可能关键字不对啊);
3.自动动手尝试,不要想当然;你不试就问人,凭什么??
4.不要动不动问老师。
5.最后的控制台中的乱码不也是自己解决了么,要相信自己
就到这,下次见。
下次绝对不熬夜。晚安。
sue
2021年3月8日01:42:19
第一次修订时间2021年3月8日13:05:35