JavaEE_day13_Servlet

一、什么是servlet喘垂?

servlet是運(yùn)行在服務(wù)器端的java小程序甜刻,是sun公司提供的一套規(guī)范(接口)绍撞,主要用來(lái)處理客戶(hù)端請(qǐng)求、響應(yīng)給瀏覽器的web動(dòng)態(tài)資源得院,實(shí)質(zhì)上就是java代碼傻铣。

二、Servlet快速入門(mén):

1.創(chuàng)建一個(gè)類(lèi)MyFirstServlet實(shí)現(xiàn)Servlet接口祥绞;
2.重寫(xiě)service方法非洲;
3.配置web.xml文件

在實(shí)際開(kāi)發(fā)中,一般情況下是繼承HttpServlet類(lèi)蜕径,然后覆蓋doGet和doPost方法两踏。

package com.zl.servlet;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class MyFirstServlet implements Servlet {

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("This is first servlet!!!");
    }
    
    
    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public ServletConfig getServletConfig() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String getServletInfo() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void init(ServletConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
        
    }
}

web.xml配置如下:

 <servlet>
    <servlet-name>MyFirstServlet</servlet-name>
    <servlet-class>com.zl.servlet.MyFirstServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>MyFirstServlet</servlet-name>
    <url-pattern>/myFirstServlet</url-pattern>
  </servlet-mapping>

三、Servlet的相關(guān)方法:

1.getServletName(): 獲得servlet的name
2.getInitParameter("參數(shù)的name"): 獲得servlet的初始化參數(shù)
3.getServletContext(): 獲得Servletcontext對(duì)象

@Override
    public void init(ServletConfig config) throws ServletException {
        // TODO Auto-generated method stub
        //1兜喻、獲得servlet的name----<servlet-name>abc</servlet-name>
        String servletName = config.getServletName();//MyFirstServlet
        System.out.println(servletName);
        //2梦染、獲得該servlet的初始化的參數(shù)
        String initParameter = config.getInitParameter("url");
        System.out.println(initParameter);
        //3、獲得Servletcontext對(duì)象
        ServletContext servletContext = config.getServletContext();
        System.out.println(servletContext);
        
        System.out.println("init running !!!");
    }

四朴皆、Servket的生命周期:

1.Servlet接口中的方法:

(1)Init(ServletConfig config):
何時(shí)執(zhí)行:創(chuàng)建Servlet對(duì)象時(shí)執(zhí)行
ServletConfig:代表的是該Servlet對(duì)象的配置信息

(2)service(ServletRequest resquest , ServletResponse response):
何時(shí)執(zhí)行:每次請(qǐng)求都會(huì)執(zhí)行
ServletRequest: 代表請(qǐng)求帕识,封裝的是Http請(qǐng)求的信息
ServletResponse: 代表響應(yīng),封裝的是服務(wù)器響應(yīng)的信息

(3)destroy():
何時(shí)執(zhí)行:servlet對(duì)象銷(xiāo)毀的時(shí)候執(zhí)行遂铡,也就是說(shuō)服務(wù)器關(guān)閉的時(shí)候執(zhí)行

2.HttpServlet類(lèi)的方法:

(1)肮疗、init()
(2)、doGet(HttpServletRequest request,HttpServletResponse response)
(3)扒接、doPost(HttpServletRequest request,HttpServletResponse response)
(4)族吻、destroy()

3.Servlet的生命周期:

(1)Servlet何時(shí)創(chuàng)建:
默認(rèn)第一次訪(fǎng)問(wèn)servlet時(shí)創(chuàng)建該對(duì)象

(2)Servlet何時(shí)銷(xiāo)毀:
服務(wù)器關(guān)閉,servlet就銷(xiāo)毀

(3)每次訪(fǎng)問(wèn)必執(zhí)行的方法:
service(ServletResquest resquest 珠增, ServletResponse response)方法

五超歌、Servlet配置:

1.基本配置
<servlet>
    <servlet-name>MyFirstServlet</servlet-name>
    <servlet-class>com.zl.servlet.MyFirstServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>MyFirstServlet</servlet-name>
    <url-pattern>/myFirstServlet</url-pattern>
</servlet-mapping>

其中url-pattern的配置方式:
(1)完全匹配 訪(fǎng)問(wèn)的資源與配置的資源完全相同才能訪(fǎng)問(wèn)到:

<url-pattern>/myFirstServlet</url-pattern>

(2)目錄匹配 格式:/虛擬的目錄../* *代表任意:

<url-pattern>/aaa/bbb/ccc/*</url-pattern>

(3)擴(kuò)展名匹配 格式:*.擴(kuò)展名:

<url-pattern>/*.abcd</url-pattern>
2.服務(wù)器啟動(dòng)實(shí)例化配置:

Servlet何時(shí)創(chuàng)建:默認(rèn)第一次訪(fǎng)問(wèn)時(shí)創(chuàng)建
為什么是默認(rèn)?
當(dāng)配置servlet時(shí)加上<load-on-startup>時(shí),servlet對(duì)象就在服務(wù)器啟東市創(chuàng)建蒂教。

 <load-on-startup>3</load-on-startup>
3.缺省的Servlet:

可以將url-pattern配置一個(gè)/巍举,代表該servlet是缺省的servlet。
什么是缺省的servlet凝垛?
當(dāng)你訪(fǎng)問(wèn)資源地址所有的servlet都不匹配時(shí) 懊悯, 缺省的servlet負(fù)責(zé)處理

4.歡迎頁(yè)面:
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
</welcome-file-list>

六、案例:用戶(hù)登錄

1.首先準(zhǔn)備一個(gè)login.html頁(yè)面

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="/WEB13A/login" method="post">
        用戶(hù)名:<input type="text" name="username"><br />
        密碼:<input type="password" name="password"><br />
        <input type="submit" value="登錄"><br />
    </form>
</body>
</html>

2.然后編寫(xiě)LoginServlet類(lèi):

package com.zl.login;

import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;

import com.zl.domain.User;
import com.zl.utils.DataSourceUtils;

public class LoginServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1.獲取用戶(hù)名和密碼
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        
        //2.從數(shù)據(jù)庫(kù)中驗(yàn)證該用戶(hù)名密碼是否正確
        QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
        String sql="select * from user where username=? and password=?";
        User user =null;
        try {
            user = qr.query(sql, new BeanHandler<User>(User.class), username,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        
        //3梦皮、根據(jù)返回的結(jié)果給用戶(hù)不同顯示信息
        if(user!=null){
            //登錄成功
            response.getWriter().write(user.toString());
        }else{
            //登錄失敗
            response.getWriter().write("username or password error!!!");
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

3.寫(xiě)一個(gè)User實(shí)體類(lèi):

package com.zl.domain;

public class User {
    private int id;
    private String username;
    private String password;
    private String email;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", password=" + password + ", email=" + email + "]";
    }
}

4.在WebContent下的WEB-INF下的lib文件夾導(dǎo)入三個(gè)包:


5.在src根目錄下導(dǎo)入c3p0配置文件:
c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config>
        <property name="user">root</property>
        <property name="password">a12345</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///web13</property>
    </default-config> 
</c3p0-config>

其中炭分,web13是數(shù)據(jù)庫(kù)名稱(chēng)。

6.編寫(xiě)DataSourceUtils類(lèi):

package com.zl.utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DataSourceUtils {

    private static DataSource dataSource = new ComboPooledDataSource();

    private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();

    // 直接可以獲取一個(gè)連接池
    public static DataSource getDataSource() {
        return dataSource;
    }

    // 獲取連接對(duì)象
    public static Connection getConnection() throws SQLException {

        Connection con = tl.get();
        if (con == null) {
            con = dataSource.getConnection();
            tl.set(con);
        }
        return con;
    }

    // 開(kāi)啟事務(wù)
    public static void startTransaction() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            con.setAutoCommit(false);
        }
    }

    // 事務(wù)回滾
    public static void rollback() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            con.rollback();
        }
    }

    // 提交并且 關(guān)閉資源及從ThreadLocall中釋放
    public static void commitAndRelease() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            con.commit(); // 事務(wù)提交
            con.close();// 關(guān)閉資源
            tl.remove();// 從線(xiàn)程綁定中移除
        }
    }

    // 關(guān)閉資源方法
    public static void closeConnection() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            con.close();
        }
    }

    public static void closeStatement(Statement st) throws SQLException {
        if (st != null) {
            st.close();
        }
    }

    public static void closeResultSet(ResultSet rs) throws SQLException {
        if (rs != null) {
            rs.close();
        }
    }

}

整體目錄結(jié)構(gòu)如下:

七剑肯、ServletContext:

1.什么是ServletContext捧毛?
ServletContext代表是一個(gè)web應(yīng)用的環(huán)境(上下文)對(duì)象,ServletContext對(duì)象內(nèi)部封裝是該web應(yīng)用的信息,一個(gè)web應(yīng)用只有一個(gè)ServletContext對(duì)象呀忧。

2.ServletContext對(duì)象的生命周期师痕?
創(chuàng)建:該web應(yīng)用被加載(服務(wù)器啟動(dòng)或發(fā)布web應(yīng)用(前提,服務(wù)器啟動(dòng)狀 態(tài)))
銷(xiāo)毀:web應(yīng)用被卸載(服務(wù)器關(guān)閉而账,移除該web應(yīng)用)

3.獲得web應(yīng)用的初始化參數(shù):
首先在web.xml配置<context-param>:

<context-param>
    <param-name>driver</param-name>
    <param-value>com.mysql.jdbc.Driver</param-value>
</context-param>

通過(guò)context獲得參數(shù):

//獲取servletcontex對(duì)象
        ServletContext context = this.getServletContext();
        //1胰坟、獲得初始化參數(shù)
        String initParameter = context.getInitParameter("driver");
        System.out.println(initParameter);

4.獲得web應(yīng)用中任何資源的絕對(duì)路徑:
方法:String path = context.getRealPath(相對(duì)于該web應(yīng)用的相對(duì)地址);

a.txtWebContent下,b.txtWEB-INF下泞辐,c.txtsrc下笔横,d.txtWEB13A下。

//2咐吼、獲得a b c d.txt的絕對(duì)路徑
        //2.1 獲得a.txt
        String realPath_A = context.getRealPath("a.txt");
        System.out.println(realPath_A);
        //2.2 獲得b.txt
        String realPath_B = context.getRealPath("WEB-INF/b.txt");
        System.out.println(realPath_B);
        //2.3 獲得c.txt
        String realPath_C = context.getRealPath("WEB-INF/classes/c.txt");
        System.out.println(realPath_C);
        //2.4 獲得d.txt----獲取不到

        //在讀取src(classes) 下的資源是可以同類(lèi)加載器----專(zhuān)門(mén)加載classes 下的文件的
        //getResource() 參數(shù)是一個(gè)相對(duì)地址 相對(duì)classes
        String path = ContextServlet.class.getClassLoader().getResource("c.txt").getPath();
        System.out.println(path);

5.ServletContext是一個(gè)域?qū)ο?
什么是域?qū)ο蟠档蓿渴裁词怯颍?br> 存儲(chǔ)數(shù)據(jù)的區(qū)域就是域?qū)ο?/p>

ServletContext域?qū)ο蟮淖饔梅秶赫麄€(gè)web應(yīng)用(所有的web資源都可以隨意向servletcontext域中存取數(shù)據(jù),數(shù)據(jù)可以共享)

域?qū)ο蟮耐ㄓ玫姆椒ǎ?/p>

setAtrribute(String name,Object obj);
getAttribute(String name);
removeAttribute(String name);

案例:統(tǒng)計(jì)登錄次數(shù):

package com.itheima.login;

import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;

import com.itheima.domain.User;
import com.itheima.utils.DataSourceUtils;

public class LoginServlet extends HttpServlet {
    
    @Override
    public void init() throws ServletException {
        //在Seveltcontext域中存一個(gè)數(shù)據(jù)count
        int count = 0;
        this.getServletContext().setAttribute("count", count);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        
        
        //username=zhangsan&password=123
        
        //1汽烦、獲得用戶(hù)名和密碼
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        
        //2涛菠、從數(shù)據(jù)庫(kù)中驗(yàn)證該用戶(hù)名和密碼是否正確
        QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
        String sql = "select * from user where username=? and password=?";
        User user = null;
        try {
            user = runner.query(sql, new BeanHandler<User>(User.class), username,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        
        //3、根據(jù)返回的結(jié)果給用戶(hù)不同顯示信息
        if(user!=null){
            //從servletcontext中取出count進(jìn)行++運(yùn)算
            ServletContext context = this.getServletContext();
            Integer count = (Integer) context.getAttribute("count");
            count++;
            //用戶(hù)登錄成功
            response.getWriter().write(user.toString()+"---you are success login person :"+count);
            context.setAttribute("count", count);
        }else{
            //用戶(hù)登錄失敗
            response.getWriter().write("sorry your username or password is wrong");
        }
        
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

Servlet模板:

package ${enclosing_package};
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ${primary_type_name} extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().write("hello haohao...");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撇吞,一起剝皮案震驚了整個(gè)濱河市俗冻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牍颈,老刑警劉巖迄薄,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異煮岁,居然都是意外死亡讥蔽,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)画机,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)冶伞,“玉大人,你說(shuō)我怎么就攤上這事步氏∠烨荩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵荚醒,是天一觀(guān)的道長(zhǎng)芋类。 經(jīng)常有香客問(wèn)我,道長(zhǎng)界阁,這世上最難降的妖魔是什么侯繁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮泡躯,結(jié)果婚禮上贮竟,老公的妹妹穿的比我還像新娘丽焊。我一直安慰自己,他們只是感情好坝锰,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布粹懒。 她就那樣靜靜地躺著重付,像睡著了一般顷级。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上确垫,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天弓颈,我揣著相機(jī)與錄音,去河邊找鬼删掀。 笑死翔冀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的披泪。 我是一名探鬼主播纤子,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼款票!你這毒婦竟也來(lái)了控硼?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤艾少,失蹤者是張志新(化名)和其女友劉穎卡乾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體缚够,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡幔妨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谍椅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片误堡。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖雏吭,靈堂內(nèi)的尸體忽然破棺而出锁施,到底是詐尸還是另有隱情,我是刑警寧澤思恐,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布沾谜,位于F島的核電站,受9級(jí)特大地震影響胀莹,放射性物質(zhì)發(fā)生泄漏基跑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一描焰、第九天 我趴在偏房一處隱蔽的房頂上張望媳否。 院中可真熱鬧栅螟,春花似錦、人聲如沸篱竭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)掺逼。三九已至吃媒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吕喘,已是汗流浹背赘那。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氯质,地道東北人募舟。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像闻察,于是被迫代替她去往敵國(guó)和親拱礁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理辕漂,服務(wù)發(fā)現(xiàn)呢灶,斷路器,智...
    卡卡羅2017閱讀 134,704評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法钮热,類(lèi)相關(guān)的語(yǔ)法填抬,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法隧期,異常的語(yǔ)法飒责,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,664評(píng)論 18 399
  • Servlet學(xué)習(xí)的大綱 servlet概念及相關(guān)接口簡(jiǎn)介 servet 執(zhí)行過(guò)程 servlet映射路徑 缺省s...
    奮斗的老王閱讀 1,200評(píng)論 1 51
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司仆潮,掛了不少宏蛉,但最終還是拿到小米、百度性置、阿里拾并、京東、新浪鹏浅、CVTE嗅义、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,277評(píng)論 11 349
  • 帶著新來(lái)的《讀庫(kù)》和手機(jī)進(jìn)了洗手間之碗,或選其一,或讀書(shū)聽(tīng)歌各司其職季希,總是給自己太多選擇褪那,終究幽纷,我們會(huì)辜負(fù)一方。 今天...
    片姐閱讀 287評(píng)論 0 0