【SSH】——一条线看SSH框架

本文详细介绍了SSH(Struts2+Hibernate+Spring)框架在搭建网上商城系统中的应用过程,涵盖了从前台展示到后台业务逻辑处理的各个环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

SSH网上商城完成了,现在回头通过一条线再理理。

SSH旅游路线

这里写图片描述

下边就从jsp开始,看SSH。

JSP站

jsp就是整个SSH的前台显示部分,跟.net的html页面一样。

jsp页面调用Action方法的两种方式:
1、在form表单里直接调用:

<form id="loginForm" action="${ pageContext.request.contextPath }/user_login.action"  method="post" novalidate="novalidate">

在提交表单的时候就直接转到UserAction下调用login方法了。

2、有条件查询

<a href="${ pageContext.request.contextPath }/order_findByOid.action?oid=<s:property value="#order.oid" />">付款</a>

根据订单的id进行查询订单,将order的id传入OrderAction下的findByOid方法里。

另外,jsp还需要获取从Action传回来的值,一般是Action将值放进值栈里,然后在jsp页面直接从值栈里取就行了。

<s:property value="#order.total" />

Action站

Action一般首先得集成ActionSupport,并且实现ModelDriven,并使用ModelDriven

public class UserAction extends ActionSupport implements ModelDriven<User> {
    // 模型驱动使用的对象
    private User user = new User();
    public User getModel() {
        return user;
    }   
}

还需要注入Service

// 注入UserService
private UserService userService;

public void setUserService(UserService userService) {
    this.userService = userService;
}

然后就可以开始写方法,调用Service层的方法

public String regist() {
    // 判断验证码程序:
    // 从session中获得验证码的随机值:
    String checkcode1 = (String) ServletActionContext.getRequest()
            .getSession().getAttribute("checkcode");
    if(!checkcode.equalsIgnoreCase(checkcode1)){
        this.addActionError("验证码输入错误!");
        return "checkcodeFail";
    }
    userService.save(user);
    this.addActionMessage("注册成功!请去邮箱激活!");
    return "msg";
}

Service站

Service需要注意的两点是:
1、加事务:@Transactional
2、注入Dao

然后就直接写调用Dao层的方法就行了。

// 用户登录的方法
public User login(User user) {
    return userDao.login(user);
}

Dao站

Dao层主要用到hibernate进行增删改查操作,其中增删改都很简单

this.getHibernateTemplate().add(entity);//增加实体
this.getHibernateTemplate().update(entity);//修改实体
this.getHibernateTemplate().delete(entity);//删除实体

稍微难点的就是查询操作:
查询有三种,有参查询,无参查询和分页查询

//无参查询
String hql = "from User where code = ?";
List<User> list = this.getHibernateTemplate().find(hql,code);
//有参查询
String hql = "from User where username = ? and password = ? and state = ?";
List<User> list = this.getHibernateTemplate().find(hql, user.getUsername(),user.getPassword(),1);
//分页查询
String hql="from Order order by ordertime desc";
List<Order> list = this.getHibernateTemplate().execute(new PageHibernateCallback<Order>(hql, null, begin, limit));

Vo站

根据上边的旅游路线可以看出来Vo层就是.net里的model实体层,起到的作用就是传递数据。
Vo层里主要有两个部分:
1、实体
2、实体映射文件(hbm.xml)

Spring配置注入

Action和Service都涉及到了注入的问题,所以我们需要在spring进行配置。

在实现注入之前,需要先在spring里配置连接池以及hibernate的相关配置:

<!-- 引入外部属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置C3P0连接池: -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driver}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="user" value="${jdbc.user}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>
<!-- Hibernate的相关信息 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <!-- 注入连接池 -->
    <property name="dataSource" ref="dataSource"/>
    <!-- 配置Hibernate的其他的属性 -->
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.connection.autocommit">false</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
    <!-- 配置Hibernate的映射文件 -->
    <property name="mappingResources">
        <list>
            <value>cn/itcast/shop/user/vo/User.hbm.xml</value>
            <value>cn/itcast/shop/category/vo/Category.hbm.xml</value>
            <value>cn/itcast/shop/product/vo/Product.hbm.xml</value>                
            <value>cn/itcast/shop/categorysecond/vo/CategorySecond.hbm.xml</value>
            <value>cn/itcast/shop/order/vo/Order.hbm.xml</value>
            <value>cn/itcast/shop/order/vo/OrderItem.hbm.xml</value>
            <value>cn/itcast/shop/adminuser/vo/AdminUser.hbm.xml</value>
        </list>
    </property>
</bean>

配置hibernate的映射文件,将Vo层里的实体映射文件都放在这里。

然后开始注入的配置:

<!-- Action的配置 -->
<bean id="indexAction" class="cn.itcast.shop.index.action.IndexAction" scope="prototype">
    <property name="categoryService" ref="categoryService"/>    
</bean>
<!-- Service的配置  ===========================-->
<bean id="userService" class="cn.itcast.shop.user.service.UserService">
    <property name="userDao" ref="userDao"/>
</bean>
<!-- Dao的配置  ===========================-->
<bean id="userDao" class="cn.itcast.shop.user.dao.UserDao">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

Bingo!

struct配置

在Action进行页面跳转的时候,都需要进行struct的配置。页面跳转分为两种:
1、直接跳转:

<action name="user_*" class="userAction" method="{1}">
    <result name="registPage">/WEB-INF/jsp/regist.jsp</result>
</action>

2、重定向跳转页面:

<result name="loginSuccess" type="redirectAction">index</result>

总结

这样SSH的一条线就完成了!其实很简单嘛~~~继续其他知识点的总结咯!

### 实现QT应用在树莓派3上的远程部署 为了实现在树莓派3上进行QT应用的远程部署,可以通过多种方式完成这一过程。以下是详细的说明: #### 使用 `rsync` 同步编译后的 QT 库 如果已经在 PC 上完成了 QT 的编译工作,则可以直接通过 `rsync` 命令将编译好的 QT 库同步到树莓派的目标路径中。具体命令如下: ```bash rsync -avz Qt5.12.4 pi@raspberrypi_ip:/usr/local ``` 此命令能够高效地传输数据并保持文件权限一致[^1]。 #### 文件传输工具 FileZilla 进行程序上传 另一种常见的方式是使用 FTP/SFTP 工具(如 FileZilla),将编译生成的可执行文件(例如 `a.out`)传送到树莓派的目标目录。在此之前需确认树莓派已启用 SSH 服务,并确保其正常运行[^2]。 #### VSCode 配合 Remote-SSH 插件实现远程开发与调试 对于希望直接在本地计算机上编写代码并通过网络实时更新至树莓派的情况,推荐使用 Visual Studio Code (VSCode) 及其内置插件 **Remote - SSH** 来建立连接。这种方式允许开发者无需频繁手动复制文件即可轻松管理项目源码以及测试环境设置。主要流程包括以下几个方面: - 确认树莓派和主机处于同一局域网内; - 开启树莓派端口转发功能以便外部访问; - 安装并配置好对应版本的 GCC 编译器链路表单; 一旦建立了稳定的 SSH 连接之后,在 VSCode 中就可以像对待本机一样自由操控远端资源了[^3]。 #### 考虑不同图形界面框架的选择 当涉及到 GUI 类型的应用构建时,除了传统的基于 X Window System 架构外,还可以考虑更为精简高效的解决方案——比如嵌入式的 Framebuffer 技术或是借助 OpenGL ES 提供硬件加速渲染能力从而达到更好的性能表现。特别是针对一些特定行业应用场景下的需求来说尤为重要[^4]。 #### 创建适合 ARM 平台架构特性的交叉编译环境 最后值得注意的是,由于 Raspberry Pi 所使用的处理器属于 ARM Cortex-A 系列而非标准 x86/x64 处理单元结构体系之下运作的产品线之一部分原因所致因此我们需要特别注意选用恰当类型的 toolchain tools chain来进行相应的移植适配处理作业活动才行哦!这里提供了一个非常详尽的教学指南可供参考学习之用:[(37条消息) 为3568或3288 arm板创建交叉编译环境](https://blog.youkuaiyun.com/weixin_43957010/article/details/118777887)[^5] --- ### 示例代码片段展示 下面给出一段简单的 HelloWorld C++ 程序作为例子演示如何跨平台编译它成为可以在 RPi 设备上面顺利加载起来的形式存在。 ```cpp #include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton button("Hello World"); button.resize(200, 100); QObject::connect(&button,SIGNAL(clicked()),qApp,SLOT(quit())); button.show(); return app.exec(); } ``` ---
评论 59
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值