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


   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM