项目整合中的问题:
1、日志:
spring5 不在使用org.springframework.web.util.Log4jConfigListener,不能配置log4j监听器,可以使用log4j2进行日志记录。
2、springmvc整合thymeleaf:
配置文件中添加<property name="viewNames" value="*.html,*.xhtml" />则无法进行解析,报500错误,原因不明。
3、使用全局异常处理器:
同时在web.xml页面中获拦截404、500等错误,是否同时使用,thymeleaf中怎么直接获取exception异常?
4、跟目录访问可以直接跳转到指定视图解析器,index.html需要经过视图解析器,不然渲染不出来
<mvc:view-controller path="/" view-name="forward:/hello"/>
5、时刻检查target文件是否更新,idea更新延迟。
6、thymeleaf中使用th:if应注意第一次获取session中的值应使用request.
<!--第一次必须使用request请求获取session,不然session不会产生-->
<li><a th:href="@{/login}" th:if="${#request.getSession().getAttribute('username')} == null" th:text="登录"></a></li>
7、springmvc配置拦截器:
注意interceptor的处理。
8、cookie无法删除:
Cookie设置maxage为0时可以删除cookie。
cookie包含路径,不同路径下的cookie视为不同的cookie,删除时应使用统一路径,同名的cookie覆盖。cookie默认path为请求的上一层,当请求为path1/path2 、path/、path2/in.action时为path1,想要删除一定要设置为统一路径再覆盖
9、spring 注入:
junit单元测试时spring的@Autowired注入为空
在测试类上添加以下注释,测试时自动创建Spring的应用上下文:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:beans.xml" })或者@ContextConfiguration("classpath:beans.xml")
注意:@ContextConfiguration的value默认就是“locations",所以@ContextConfiguration的以上两种写法一样,如下:
@AliasFor("locations")
String[] value() default {};
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration( locations = "classpath:applicationContext.xml") public class Test_SSM { @Autowired private UserService userService; @Test public void show() { System.out.println(userService); } }
10、mybatis-generator生成的Example使用。
11、springmvc数据校验:
SpringMVC的数据校验
一、注解方式
二、示例
Spring MVC本身没有数据校验的功能,它使用Hibernate的校验框架来完成。
1.导入pom节点
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.4.1.Final</version> </dependency>
2.编辑UserInfo实体类
public class UserInfo { @NotNu1l(message="编号不能为空") private Integer user_ id; @NotNull @Length(min = 2,max = 8,message = "用户名不能少于2位大于8位" ) private String user. name; @Email(message = "邮箱格式不正确") private String user. email; @Pattern(regexp = "" ,message = "手机号格式不正切") private String user. phone; private String user_ address; @Pattern(regexp =“" ,message =” 身份证号不正确") private String user. cardCode; //身份证号 pub1ic Integer getUser_ id() { return user_ id; }
3.编写jsp页面
<form action=" /my/validate" method="post"> 编号: <input type="text" name="user. id"/> <br/> 姓名: <input type= "text" name="user. name"/> <br/> 邮箱: <input type="text" name="user. email"/> <br/> 手机号: <input type="text" name="user phone"/> <br/> 地址: <input type="text" name="user. address"/> <br/> 身份证号:<input type="text" name="user cardCode"/> <br/> <input type="submit" value=" 提交" /> </form>
4.编写validate进行数据的效验
@RequestMapping("/validate") public String validate(@Valid UserInfo info, BindingResult bindingResult){ //如果有异常信息 if (bindingResult . hasErrors()) { //获取异常信息对象 List<0bjectError> errors = bindingResult . getAllErrors(); //将异常信息输出 for (ObjectError error : errors) { System. out .println(error . getDefaultMessage()); } System. out . print1n(info. getUser_ email()); return "index" ; }
使用JSR303校验:
https://www.jianshu.com/p/fc6c20af759a
javaX发送邮件:
package com.fakebilibili.util; import java.util.Properties; import javax.mail.Address; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class MailUtil { static Properties properties; static Message msg; static Transport transport; //初始化Mail信息 public MailUtil(){ properties = new Properties(); properties.setProperty("mail.debug", "true");//调试模式发送 properties.setProperty("mail.smtp.auth", "true");//身份验证设置 properties.setProperty("mail.host", "smtp.qq.com");//发件人邮箱主机名 properties.setProperty("mail.transport.protocol", "smtp");//发件协议 properties.setProperty("mail.smtp.ssl.enable", "true");//qq邮箱的SSL加密 Session session = Session.getInstance(properties); msg = new MimeMessage(session); try { msg.setSubject("FakeBilibili网站验证邮件"); msg.setFrom(new InternetAddress("1720476708@qq.com"));//设置发件人 transport = session.getTransport(); transport.connect("1720476708@qq.com", "solbvabkucameied");//设置发件人在该邮箱主机上的用户名密码 } catch (MessagingException e) { e.printStackTrace(); } } /** * 得到邮箱地址邮箱内容发送。 * @param 邮箱地址 * @param 邮箱内容 * @throws AddressException * @throws MessagingException */ public void sendMail(String address,String text) throws AddressException, MessagingException{ msg.setText(text); transport.sendMessage(msg, new Address[] {new InternetAddress(address)}); transport.close(); } }
通过qq邮箱发送验证。
文件上传bean id必须为
multipartResolver
写错了上传不了。文件上传原理。
文件上传进度条实现?单独的文件服务器实现?
使用jQuery解析json字符串
一、jQuery解析Json数据格式:
使用这种方法,你必须在Ajax请求中设置参数:
dataType: "json"
获取通过回调函数返回的数据并解析得到我们想要的值,看源码:
1
2
3
4
5
6
|
jQuery.ajax({ url: full_url, dataType: "json" , success: function (results) { alert(result.name); } }); |
通常情况下,你可以从后台返回JSON数据,前台就交给jQuery啦,哈哈!!
jquery异步请求将type(一般为这个配置属性)设为“json”,或者利用$.getJSON()方法获得服务器返回,那么就不需要eval()方法了,因为这时候得到的结果已经是json对象了,只需直接调用该对象即可,这里以$.getJSON方法为例
例1
var data=" { root: [ {name:'1',value:'0'}, {name:'6101',value:'北京市'}, {name:'6102',value:'天津市'}, {name:'6103',value:'上海市'}, {name:'6104',value:'重庆市'}, {name:'6105',value:'渭南市'}, {name:'6106',value:'延安市'}, {name:'6107',value:'汉中市'}, {name:'6108',value:'榆林市'}, {name:'6109',value:'安康市'}, {name:'6110',value:'商洛市'} ] }";
$.getJSON("https://www.jb51.net/",{param:"sanic"},function(data){ //此处返回的data已经是json对象 //以下其他操作同第一种情况 $.each(data.root,function(idx,item){ if(idx==0){ return true;//同countinue,返回false同break } alert("name:"+item.name+",value:"+item.value); }); });
二、jQuery解析Json对象:
jQuery提供了另一种方法“parseJSON”,这需要一个标准的JSON字符串,并返回生成的JavaScript对象。让我们来看看语法:
看看它是如何运用的到实际开发中的:
1
2
3
4
5
6
|
jQuery.ajax({ url: dataURL, success: function (results) { var parsedJson = jQuery.parseJSON(results); alert(parsedJson.name); } }); |
1. request
request是表示一个请求,只要发出一个请求就会创建一个request,它的作用域:仅在当前请求中有效。
用处:常用于服务器间同一请求不同页面之间的参数传递,常应用于表单的控件值传递。
方法:request.setAttribute(); request.getAttribute(); request.removeAttribute(); request.getParameter().
2. session
服务器会为每个会话创建一个session对象,所以session中的数据可供当前会话中所有servlet共享。
会话:用户打开浏览器会话开始,直到关闭浏览器会话才会结束。一次会话期间只会创建一个session对象。
用处:常用于web开发中的登陆验证界面(当用户登录成功后浏览器分配其一个session键值对)。
方法:session.setAttribute(); session.getAttribute(); session.removeAttribute();
获得session对象方法:
- 在Servlet中:HttpSession session = request.getSession();
- 由于session属于jsp九大内置对象之一,当然可以直接使用。例如:<%session.serAttribute("name","admin")%>。
session被销毁
1)session超时;
2)客户端关闭后,再也访问不到和该客户端对应的session了,它会在超时之后被销毁;
3)调用session. invalidate();
备注: session是服务器端对象,保存在服务器端。并且服务器可以将创建session后产生的sessionid通过一个cookie返回给客户端,以便下次验证。(session底层依赖于cookie)
3. Application(ServletContext)
作用范围:所有的用户都可以取得此信息,此信息在整个服务器上被保留。Application属性范围值,只要设置一次,则所有的网页窗口都可以取得数据。ServletContext在服务器启动时创建,在服务器关闭时销毁,一个JavaWeb应用只创建一个ServletContext对象,所有的客户端在访问服务器时都共享同一个ServletContext对象;ServletContext对象一般用于在多个客户端间共享数据时使用;
获取Application对象方法(Servlet中):
ServletContext app01 = this.getServletContext();
app01.setAttribute("name", "kaixuan"); //设置一个值进去
ServletContext app02 = this.getServletContext();
app02.getAttribute("name"); //获取键值对
ServletContext同属于JSP九大内置对象之一,故可以直接使用
备注:服务器只会创建一个ServletContext 对象,所以app01就是app02,通过app01设置的值当然可以通过app02获取。
总结:
1.作用域: request session application
* 使用作用域传递数据和存储数据
* 使用作用域传递数据时,必须掌握作用域对应的生命周期和作用范围
*
2. * 生命周期
* (1) request:只限于一次请求
* (2) session:一次会话(多次请求)
* 开始
* 用户向服务器发送请求的时候
* 结束
* 客户端
* 丢失JsessionId值的时候(关闭浏览器)
* 服务器端
* 关闭服务器
* 超过会话的不活动周期时间
* (3) application:项目的加载到卸载
*3.作用范围
* (1) requset:所有被请求转发的Servlet
* (2) session:所有的Servlet
* (3)application:所有的Servlet(换一个浏览器演示,跟session作用域区分)
*
4.*如何正确的选择作用域
*(1) request:跟当前操作功能相关
* (2) session: 跟用户信息相关
* (3) application:跟项目全局信息相关----》京东配送地址
*
* 5.如何正确的选择作用域不正确,会出现什么情况
* 内存浪费
jsp的四大作用域对象:
page(pageContext)
request(HttpServletRequest)
session(HttpSession)
application(ServletContext)
jsp的九大内置对象:
pageContext(pageContext)也包含了另外八大对象的引用
request(HttpServletRequest)
session(HttpSession)
application(ServletContext)
response(HttpResponse)
config(ServletConfig)
out(JspWriter)
page(Object)
exception(Throwable)
括号内为其对应的类,这些对象都是存在于jsp中的,可以直接使用
四、pageContext域—(PageContext)
1、生命周期:当对JSP的请求时开始,当响应结束时销毁。
2、作用范围:整个JSP页面,是四大作用域中最小的一个。
3、作用:
获取其它八大隐式对象,可以认为是一个入口对象。
获取其所有域中的数据
session的生命周期
Session存储在服务器端,一般为了防止在服务器的内存中(为了高速存取),Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。
Session什么时候失效?
1. 服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为30分钟。
2. 调用Session的invalidate方法。
Session对浏览器的要求:
虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。
该Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。
注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择"在新窗口中打开"时,子窗口便可以访问父窗口的Session。
如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。
URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。
注意:TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie。尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中就不会带有jsessionid了。
servlet生命周期
使用layui。
预期包含的知识点:
1 使用Session+Cookie实现用户选择免登录;o
2、使用springmvc拦截器检验用户是否登录;O
3、全局异常处理器;O
4、使用log4j2实现日志功能;O
5、实现简单的视频播放功能;O
6、实现留言功能;O
7、实现使用单独文件服务器存放视频的功能; 暂时不做。X
8、实现自动生成验证码功能;O
9、实现邮箱注册校验功能;O
10、使用Nginx实现负载均衡;6
11、使用redis缓存;4
12、实现用户间的相互关注行为;O button无法改变值?
13、实现全站搜索功能;3
14、增加管理员界面。2
15、用户个人信息修改功能。O
16、使用JSR自动校验OX
17、部署至linux.5