SSM+thymeleaf

项目整合中的问题:

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对象。让我们来看看语法:

代码如下:
data = $.parseJSON(string);


看看它是如何运用的到实际开发中的:

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对象方法:

  1. 在Servlet中:HttpSession session = request.getSession();
  2. 由于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生命周期

https://blog.csdn.net/zhouym_/article/details/90741337

 使用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


   
原文地址:https://www.cnblogs.com/baldprogrammer/p/13646991.html