zoukankan      html  css  js  c++  java
  • 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


       
  • 相关阅读:
    .net 实现 URL重写,伪静态
    jquery上传插件AjaxUpload使用示例
    事实上
    C# DataSet和DataTable详解
    当你累了,准备放弃时,看看这个吧!!!
    asp.net页面数据传递总结
    在Global.asax中根据请求路径判断是否可以访问。。。我没思路只好这样了
    今儿改的
    C 语言利用数组实现大数计算
    开始学习 类
  • 原文地址:https://www.cnblogs.com/baldprogrammer/p/13646991.html
Copyright © 2011-2022 走看看