SSH框架搭建详细图文教程(转)

这篇文章看的我醍醐灌顶的感觉,比之前本科时候学习的SSH架构 要清晰数倍 

非常感觉这篇博主的文章

文章链接为:http://blog.sina.com.cn/s/blog_a6a6b3cd01017c57.html

因为觉得写的太好了 想收藏一下

 

什么是SSH?


SSH对应 struts spring hibernate
struts 采用MVC模式,主要是作用于用户交互
spring 采用IOC和AOP~作用比较抽象,是用于项目的松耦合
hibernate 是对象持久化框架,其实就是实体类和数据库表建立关系,操作类就会触发相应的sql语句,可以不用写任何sql语句,完成数据库编程(引自百度知道)
SSH就是Struts + Spring + Hibernate 3个Java框架的集合,现在Java开发中常用的框架组合。用来开发后台,与前台和数据库进行数据交互。最初学这个是为了写JSP。
 
SSH框架搭建步骤很多,但是不难,因为MyEclipse已经帮我们做了大部分的工作,如果纯手动添加这个框架的话,那真是够复杂的了。不过涉及的知识挺多的,适合有一定基础的人。下面详细介绍一下SSH框架的搭建步骤并且解决了几个我在搭建过程中遇到的问题。


事先准备工作:

AS3学习笔记3-Flash程序员常用开发工具1.JDK

这个是一切的前提,相信大家都有。没有的话下面的步骤也不用看了,先安装JDK,配置环境变量吧。
JDK 7.0 下载:http://www.onlinedown.net/soft/61003.htm
配置Java环境变量教程:http://jingyan.baidu.com/article/f96699bb8b38e0894e3c1bef.html


AS3学习笔记3-Flash程序员常用开发工具2.MyEclipse

我们主要用MyEclipse来搭建SSH, 所以这个必须有,我用MyEclipse 8.5搭建过SSH,没问题。没有的话建议下载高版本的,与时俱进嘛。汉化或者不汉化看个人习惯,我觉得中文用起来比较舒服。
Myeclipse 10 下载:http://www.pc6.com/softview/SoftView_57131.html
Myeclipse 汉化包及汉化教程:http://blog.csdn.net/cntanghai/article/details/6310200


AS3学习笔记3-Flash程序员常用开发工具3.MySQL

数据库,注意安装时设置的密码千万别忘了。
MySQL详细图文安装教程:http://jingyan.baidu.com/article/642c9d34aa809a644a46f717.html
MySQL 5.5.28 下载:http://down.chinaz.com/soft/29015.htm


AS3学习笔记3-Flash程序员常用开发工具4.Navicat for MySQL

MySQL视图化管理及开发工具,主要用他来操作MySQL。推荐安装,非必须。
Navicat for MySQL v10.1.7简体中文特别版下载:http://www.xiazaiba.com/html/2122.html

5.mysql-connector-java-5.0.8-bin.jar

Java连接MySQL数据库时需要用到的jar包。
jar下载:http://pan.baidu.com/share/link?shareid=444190&uk=4262258889

6.在MySQL中新建一个表,用来测试数据

我在这里准备做一个注册登录功能,所以在test里建了一个user表,表里的字段有id、username、password、nickname四个字段。nickname用来测试中文是否乱码。
SQL语句:

CREATE TABLE `user` (
  `id` bigint(20) unsigned NOT NULL auto_increment COMMENT 'ID',
  `username` varchar(40) character set utf8 NOT NULL COMMENT '用户名',
  `password` varchar(40) collate utf8_unicode_ci NOT NULL COMMENT '密码',
  `nickname` varchar(40) character set utf8 NOT NULL COMMENT '昵称',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='用户信息表';





SSH框架搭建步骤:

1.新建一个项目。打开MyEclipse,新建一个Web项目,起名就叫SSH吧,点击完成,若弹出提示点Yes即可。
SSH框架搭建详细图文教程
SSH框架搭建详细图文教程

2.添加Struts框架。右键这个项目,选择MyEclipse->Add Struts Capabilities。 在弹出的菜单中把包的路径改一下, Base package for new classes选项中的路径com.yourcompany.struts改成com.ssh.struts, 点击完成。

SSH框架搭建详细图文教程

展开WebRoot中的WEB-INF文件夹,看到目录结构如下图,证明Struts框架添加完成。
SSH框架搭建详细图文教程

3.添加Spring框架。右键这个项目,选择MyEclipse->Add Spring Capabilities。

SSH框架搭建详细图文教程

在菜单中选择如下6个库,点击下一步。
SSH框架搭建详细图文教程

更改Folder路径,选择SSH项目WebRoot文件夹下的WEB-INF,完成。

SSH框架搭建详细图文教程

现在项目的目录结构如下,Spring框架添加完成。

SSH框架搭建详细图文教程

4.连接数据库。点击右上角的图标"打开透视图",选择MyEclipse Database Explorer。在窗口中右键->New 新建一个数据库连接。

SSH框架搭建详细图文教程

Driver template 选择 MySQL Connector/J
Driver name 起名叫test
Connection URL 更改为jdbc:mysql://自己的IP地址:端口号/数据库名称
User name 填写MySQL的用户名
Password 填写MySQL的密码
Driver JARs 点击Add JARs按钮,浏览到事先准备的
mysql-connector-java-5.0.8-bin.jar
Save password 选上

SSH框架搭建详细图文教程

点击Test Driver,测试结果:数据库配置正确,点击完成。

SSH框架搭建详细图文教程

双击添加的test连接,展开目录,可以发现我们事先创建的user表。

SSH框架搭建详细图文教程



5.添加Hibernate框架。右键SSH项目,选择MyEclipse->Add Spring Capabilities。

SSH框架搭建详细图文教程

点击下一步。
SSH框架搭建详细图文教程

配置中选择第二项"Spring configuration file"。把Spring与Hibernate整合到一起,点击下一步

SSH框架搭建详细图文教程

在菜单中选第二项"Existing Spring configuration file",点击下一步。


SSH框架搭建详细图文教程

DB Driver选择在添加Spring框架时配置的test,点击下一步。

SSH框架搭建详细图文教程

取消Create SessionFactory class?这个选项,点击完成。

SSH框架搭建详细图文教程

现在的目录结构如下,SSH框架大体搭建完成。
SSH框架搭建详细图文教程

6.测试功能。

先部署一下项目,访问首页看看效果。选择窗口上方图标"Deploy MyEclipse J2EE Project to Server"->点击add添加SSH项目->Server选择MyEclipse Tomcat。

SSH框架搭建详细图文教程

项目部署成功。

SSH框架搭建详细图文教程

点击窗口上方图标"Run MyEclipse Servers"启动Tomcat。

SSH框架搭建详细图文教程

在浏览器中访问SSH项目地址,别忘了加上Tomcat的默认端口,8080端口。
输入地址:
http://localhost:8080/SSH,Tomcat会访问SSH项目WebRoot下的index.jsp。

SSH框架搭建详细图文教程

现在修改一下index.jsp中给的内容,在Body中添加"这是我的首页"。Ctrl+S保存。

SSH框架搭建详细图文教程

这里出现了一个问题,页面默认的编码为ISO-8859-1,不支持中文字符,无法保存。我们先把这个提示关掉。

选择窗口->首选项->MyEclipse->JSP->Files and Editors->JSP,把编码改为ISO 10646/Unicode(UTF-8)->应用->确定。

SSH框架搭建详细图文教程

编码问题是一个很常见的问题,为避免出现这类我提我们尽量将工作空间的所有编码格式统一,无论前台后台还是数据库,否则会引发许多问题,例如中文乱码。

选择窗口->首选项->常规->工作空间->文本文件编码选择其他->其他选项里选择UTF-8->应用->确定。


SSH框架搭建详细图文教程

这样设置后,我们的工作空间编码就比较统一了,再生成的JSP页面就是UTF-8编码格式了,能够很好的支持中文字符,不过之前生成的JSP页面编码格式要我们手动更改。
把index.jsp中<%@ page language="java" import="java.util.*" pageEncoding="XXX"%> 的pageEncoding改为UTF-8,再保存页面。这时再访问
http://localhost:8080/SSH , 正确显示中文,这回没问题了。

SSH框架搭建详细图文教程

现在写个注册登录的功能来测试一下框架整合的结果。

切换到MyEclipse DataBase Explorer视图,通过Spring框架的逆向工程功能把user表逆向成Java实体类。右键user表选择"Hibernate Reverse Engineering"。
SSH框架搭建详细图文教程

Java src folder 选择SSH项目下的src文件夹。
Java package 填写com.ssh.user

勾选前三个选项:Create POJO、Java Data Obect和Java Data Access Object。POJO类是数据库表格所对应的Java类,JDO类是MyEclipse自动生成的对数据库的一些操作,这里会封装一些常用的操作,基本上可以满足我们的各种需要了,选择下一步。


SSH框架搭建详细图文教程

Id Generator 选择 native,点击完成。


SSH框架搭建详细图文教程


此时的目录结构如下,我们可以看到系统生成了3个类,一个配置文件。
User 继承自AbstractUser,是User表的实体类。
UserDAO 封装了一些对数据库的常用操作。
User.hbm.xml 是hibernate-mapping映射配置文件,配置了哪个实体类映射哪个表,配置了实体类的哪个属性映射表里的哪列。
如果这些东西不用hibernate生成,那么我们就要自己写,要浪费很多时间,hibernate的作用就体现出来了。


SSH框架搭建详细图文教程

现在来写测试页。打开WEB-INF文件夹下的struts-config.xml文件,切换到设计视图(design)。右键->New->Form Action and JSP。

SSH框架搭建详细图文教程

填写Form表单属性:
Use case: login
Name:loginForm
在下方Form Properties中添加两个属性
username: JSP input type text
password: JSP input type password


SSH框架搭建详细图文教程

切换到JSP选项,填写JSP属性:
勾选Create JSP form
路径修改为/jsp/login.jsp
点击完成。


SSH框架搭建详细图文教程

此时的目录结构如下,可以看到在WebRoot/jsp/下 生成了一个login.jsp页。


SSH框架搭建详细图文教程

我们查看一下现在的目录结构,并把struts-config.xml切换到Source视图,看看struts框架帮我们干了什么。

可以看到目录里多了3个文件:LoginFrom.java、LoginAction.java、login.jsp。这正是我们在设计视图里选择Form,Action and JSP所配置的文件。而struts-config.xml里也相应的添加了这3个文件的映射配置信息。如果这些不用struts生成的话,就需要我们自己写,会浪费很多时间,struts的作用体现出来了。

这里说一下页面请求的执行顺序:
1、login.jsp用户填写了登录信息并点击了登录按钮,发送了一个请求(loginFrom.do)。
2、struts会通过struts-config.xml找到相应的映射配置(Action name==loginFrom)。
3、把登录表单的属性映射到loginForm.java里(bean)。
4、把loginForm和mapping、request、response一起交给LoginAction处理。
5、LoginAction执行完后的通过mapping找到跳转页面forward(这个下面会提到)
SSH框架搭建详细图文教程


现在添加两个页面:登录成功页和登录失败页实现登录后的跳转
在WebRoot/jsp/下新建两个JSP页。起名为loginSuccess.jsp和loginFail.jsp。

SSH框架搭建详细图文教程

向导信息如下:


SSH框架搭建详细图文教程

在loginSuccess.jsp页面body中添加"登录成功!<br>"。
在loginFail.jsp页面body中添加"登录失败
<br>"。

SSH框架搭建详细图文教程

把登录页、登录成功页、登录失败页3个页面相关联。
切换到struts-config.xml的设计视图。右键login.jsp->New->Forward。

SSH框架搭建详细图文教程

loginSuccess:
选择Local Action Forward
浏览Action Path:/login
填写name:loginSuccess
浏览Path:/jsp/loginSuccess.jsp
完成
loginFail:
选择Local Action Forward
浏览Action Path:/login
填写name:loginFail
浏览Path:/jsp/loginFail.jsp
完成

SSH框架搭建详细图文教程

切换到Source视图,可以看到代码如下图:
Action里多了
<forward name="loginSuccess" path="/jsp/loginSuccess.jsp" />
<forward name="loginFail" path="/jsp/loginFail.jsp" />
两行代码,页面跳转添加完成。


SSH框架搭建详细图文教程

现在来写具体的执行代码。打开LoginAction.java。可以看到自动生成的代码如下图:

SSH框架搭建详细图文教程

我们先不连数据库,先写一个测试的登录代码。

 
   public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
        LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
        //获取帐号密码
        String username = loginForm.getUsername();
        String password = loginForm.getPassword();
        //帐号密码匹配,跳转到登录成功页
        if("asd".equals(username) && "asd123".equals(password)){
            return mapping.findForward("loginSuccess");
        }
        //不匹配,跳转到登录失败页
        return mapping.findForward("loginFail");
    }

准备就绪,启动Tomcat,在浏览器中访问登录页:
http://localhost:8080/SSH/jsp/login.jsp

SSH框架搭建详细图文教程

看到这个界面,都是英文,很不爽,不仅仅因为丑。把它改成中文的,打开login.jsp,代码如下:


<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
 
<html>
    <head>
        <title>JSP for LoginForm form</title>
    </head>
    <body>
        <html:form action="/login">
            username : <html:text property="username"/><html:errors property="username"/><br/>
            password : <html:password property="password"/><html:errors property="password"/><br/>
            <html:submit/><html:cancel/>
        </html:form>
    </body>
</html>

改成:

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
 
<html>
    <head>
        <title>用户登录</title>
    </head>
    <body>
        <html:form action="/login">
            帐号 : <html:text property="username"/><html:errors property="username"/><br/>
            密码 : <html:password property="password"/><html:errors property="password"/><br/>
            <html:submit value="登录"/><html:cancel value="取消"/>
        </html:form>
    </body>
</html>

刷新一下登录页面,看看效果:

SSH框架搭建详细图文教程

登录界面汉化成功!看起来舒服多了。点击登录。
这时候因为我们什么都没填,应该跳转到登录失败页面。


SSH框架搭建详细图文教程

后退,回到登录界面,填写
帐号:asd
密码:asd123
点击登录,帐号密码和后台设置的匹配,这时候应该跳转到登录成功界面。


SSH框架搭建详细图文教程

测试完成,下面我们连接一下数据库,从数据库里取出user数据进行匹配。
想操作数据库我们要先获取DAO(data access object),我们的UserDAO是hibernate生成的,关于UserDAO的配置信息写在了applicationContext.xml里。所以在用UserDAO之前要先获取
applicationContext.xml。

百度上查找了一下相关代码,找到了一个获取applicationContext.xml的方法。Spring框架里的
ClassPathXmlApplicationContext 通过这个类可以获取到我们需要的DAO。名字和applicationContext非常像,看起来就是这个类了。

测试一下这个类是否好用:
把LoginAction打开,把代码改为:


    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
        LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
        //获取帐号密码
        String username = loginForm.getUsername();
        String password = loginForm.getPassword();
       
        //获取用户信息
        ClassPathXmlApplicationContext beans = new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println(beans);
       
        //帐号密码匹配,跳转到登录成功页
        if("asd".equals(username) && "asd123".equals(password)){
            return mapping.findForward("loginSuccess");
        }
        //不匹配,跳转到登录失败页
        return mapping.findForward("loginFail");
    }

重新启动Tomcat服务器,访问登录页http://localhost:8080/SSH/jsp/login.jsp,点击登录:
javax.servlet.ServletException: org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [applicationContext.xml]; nested exception is java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist
出现了一个错误,意思为找不到applicationContext.xml。看来我们 填写的路径有问题,这个配置文件应该是从我们项目classes的根目录开始查找的,先看一下我们的项目发布后classes的路径,右键SSH项目 ->属性->Java构建路径->源代码。

SSH框架搭建详细图文教程

可以看到我们项目发布后classes的根目录是SSH/WebRoot/WEB-INF/classes。 applicationContext.xml是这个位置的上一级,那么相对于这个路径的位置就是"../applicationContext.xml"。现在把LoginAction里的路径修改一下:

    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
        LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
        //获取帐号密码
        String username = loginForm.getUsername();
        String password = loginForm.getPassword();
       
        //获取用户信息
        ClassPathXmlApplicationContext beans = new ClassPathXmlApplicationContext("../applicationContext.xml");
        System.out.println(beans);
       
        //帐号密码匹配,跳转到登录成功页
        if("asd".equals(username) && "asd123".equals(password)){
            return mapping.findForward("loginSuccess");
        }
        //不匹配,跳转到登录失败页
        return mapping.findForward("loginFail");
    }

重新启动Tomcat服务器,访问登录页http://localhost:8080/SSH/jsp/login.jsp,点击登录:
页面不再报错,正常跳转,控制台也输出了:
org.springframework.context.support.ClassPathXmlApplicationContext@14bb075: startup date [Mon Apr 22 14:26:58 CST 2013]; root of context hierarchy]

路径的问题解决了,正确的获取到了配置信息,这个配置信息我们以后要经常用,并且没必要每次用的时候都把它创建出来,浪费时间,写一个全局变量保存它吧。在src下新建一个包com.ssh.common,在包里新建一个类Global.java。输入代码如下:

package com.ssh.common;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Global {
   
    public static ClassPathXmlApplicationContext beans = new ClassPathXmlApplicationContext("../applicationContext.xml");
   
   
    public static Object getDAO(String daoName){
        return beans.getBean(daoName);
    }
}

现在来获取数据库里的数据,在user表里新增一个用户信息
username=asd
password=asd123
nickname=中文不是乱码

SSH框架搭建详细图文教程

把LoginAction里的代码改为:

    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
        LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
        //获取帐号密码
        String username = loginForm.getUsername();
        String password = loginForm.getPassword();
       
        //检查该用户是否存在
        User instance = new User();
        instance.setUsername(username);
        instance.setPassword(password);
        UserDAO userDAO = (UserDAO)Global.getDAO("UserDAO");
        List<?> list = userDAO.findByExample(instance);
       
        //如果用户存在,则登录成功。
        if(list.size() > 0){
            User user = (User)list.get(0);
            String nickname = user.getNickname();
            //写入提示信息
            request.setAttribute("message", "您的昵称为:" + nickname);
            return mapping.findForward("loginSuccess");
        }
       
        //不匹配,跳转到登录失败页
        return mapping.findForward("loginFail");
    }

在loginSuccess.jsp的Body中添加一行代码:
<%=request.getAttribute("message")%><br>

重新启动Tomcat服务器,访问登录页http://localhost:8080/SSH/jsp/login.jsp
填写帐号:asd 密码:asd123 点击登录:

SSH框架搭建详细图文教程

登录功能完成,这是个SSH框架的搭建教程,这些测试功能就尽量简单了,大家别介意,下面来做注册功能。

切换到struts-config.xml的设计视图,右键New->Form,Action and JSP

SSH框架搭建详细图文教程

Use case填写register
Form Properties填写3个属性
username:text
password:password
nickname:text


SSH框架搭建详细图文教程

点选JSP选项,勾选Create JSP form, 路径更改为/jsp/register.jsp

SSH框架搭建详细图文教程

现在把register.jsp与login.jsp关联,做注册成功和注册失败的跳转。
右键struts-config.xml设计视图中的regiser.jsp->New->Forward。
选择Local Action Forward
Action Path:/register
Name:registerSuccess
Path:/jsp/login.jsp
完成


SSH框架搭建详细图文教程

右键struts-config.xml设计视图中的regiser.jsp->New->Forward。
选择Local Action Forward
Action Path:/register
Name:registerFail
Path:/jsp/register.jsp
完成

struts-config.xml代码如下

SSH框架搭建详细图文教程

汉化注册页面

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
 
<html>
    <head>
        <title>注册页</title>
    </head>
    <body>
        <html:form action="/register">
            用户名 : <html:text property="username"/><html:errors property="username"/><br/>
            密码 : <html:password property="password"/><html:errors property="password"/><br/>
            昵称 : <html:text property="nickname"/><html:errors property="nickname"/><br/>
            <html:submit value="确定"/><html:cancel value="取消"/>
        </html:form>
    </body>
</html>

打开RegisterAction.java文件,实现数据的插入,修改代码如下:

    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
       
        //填写的注册信息
        RegisterForm registerForm = (RegisterForm) form;
        String username = registerForm.getUsername();
        String password = registerForm.getPassword();
        String nickname = registerForm.getNickname();
       
        //检查用户名是否已被注册
        UserDAO userDAO = (UserDAO)Global.getDAO("UserDAO");
        List<?> list = userDAO.findByUsername(username);
       
        //用户名已被注册,返回注册页面
        if(list.size() > 0){
            request.setAttribute("message", "该用户名已被注册");
            return mapping.findForward("registerFail");
        }
       
        //插入新用户
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        user.setNickname(nickname);
        userDAO.save(user);
        request.setAttribute("message", "注册成功,请登录:" + nickname);
        return mapping.findForward("registerSuccess");
    }

打开login.jsp在body中添加一行代码<%=request.getAttribute("message")%><br>

重新启动Tomcat服务器,访问注册页http://localhost:8080/SSH/jsp/register.jsp
输入帐号:asd2
输入密码:asd123
输入昵称:中文不应该是乱码

点击确认
SSH框架搭建详细图文教程

页面提示:注册成功,请登录:中文不应该是乱ç
我们期望的是"中文不应该是乱码",但它变成乱码了,很常见的一种问题。百度查了一下相关问题,原因是使用Tomcat服务器时,struts的Form提交不支持中文,于是我们需要添加一个过滤器。


在com.ssh.common包下新建一个TomcatFormFilter类,代码如下:

package com.ssh.common;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;


public class TomcatFormFilter implements Filter{
    //接收字符编码
    protected String encoding;
   
    public TomcatFormFilter(){}
   
    public void init(FilterConfig filterConfig) throws ServletException {
        //从web.xml中读取encoding值
        encoding = filterConfig.getInitParameter("encoding");
    }
   
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        if(request.getCharacterEncoding() == null && encoding != null){
            //设置字符集
            request.setCharacterEncoding(encoding);
        }
        //继续执行
        chain.doFilter(request, response);
    }
   
    public void destroy() {}

}

拷贝这个类中注释代码部分的xml,粘贴到web.xml中

SSH框架搭建详细图文教程

重新启动Tomcat服务器,访问注册页http://localhost:8080/SSH/jsp/register.jsp

输入帐号:asd3
输入密码:asd123
输入昵称:这回中文不应该是乱码了
点击确定

SSH框架搭建详细图文教程

至此SSH框架的搭建全部完成
posted @ 2014-09-16 08:23  爱做饭的小莹子  阅读(2967)  评论(0编辑  收藏  举报