认知的SSH

实习了三个月,对着SSH有着一定的认识了,就以自已认识的大概思路写一篇文章吧,留给以后的自已,也恳请各位博友们如果看到我的认识有过错的地方能帮我指正过来!

  在写正文之前,先说说我这段时间学习SSH所用到的资料吧!所以在我下面所认识中所说的话如果有跟我学习资料中说的差不多的或者一模一样的,还恳请各位的原谅,毕竟我的知识就是从你们那儿学的。刚接触SSH是照着一位博友的博文来搭建的(Eclipse搭建SSH(Struts2+Spring3+Hibernate3)框架项目教程),在搭建的过程中出错了好多错误,当时我还一边在看尚学堂马士兵的视频来搭建的(发现照着网上的搭建时一般会因为你下载的spring、struts、hibernate等版本的不同而出现错误,这我们搭建时还是得参考我们所下载里面的技术文档,例如我下载的hibernate为hibernate-distribution-3.6.10.Final,在这里面有hibernate-distribution-3.6.10.Final\documentation\manual\zh-CN\html\index.html的技术文档,当然,我打开的是中文版的,里面还有别的语言版本的)。在我的框架搭建好后,我便深入的去理解。这过程中我主要有用到两份资料,一份是一博友zs234的博客,这博友写的真心不错,至少对于我来说,感觉简明易懂。还有另一份资料就是李刚的书了(JavaEE企业应用实战-Struts2Spring3Hibernate整合开发第3版,这书我网上找了份有书签的pdf,又去到当当网买了本,感觉不错。这pdf我上传到了我所在的QQ技术交流群上300638185)

  先从struts2说起(说到struts1与struts2,我觉得主要的一个不同就是struts2有着线程安全吧,而struts1的线程不安全,因为它多用户共享同一线程了),struts2是一个经典的继Model1和Model2后的MVC框架,所谓的MVC,就是Model+View+Control,Model为逻辑层,负责逻辑业务(不包括数据业务,至少我在网上看到的都是这样,但我师兄跟我说查询语句可以写到manager(有的资料也叫service,至少我第一次搭建的框架就叫service)里面,当时我就晕了,manager不是MVC里面的M吗?怎么可以写在里面了,下面讲ioc时我会说另一点为什么我不愿意丢掉dao层,到现在我还是喜欢把查询语句写在dao层里面,manager就做逻辑处理,当然我也有了解到查询语句可以写到新建的一个配置文件里面,可惜我只了解了一下,还没仔细去了解这个)。View为显示层,主要组件有jsp页面与一些jsp页面的小插件。Control为控制器,主要体现在action上面,学习action,会学习到5个名词,分别为:actionServlet、actionMapping、actionForm、action、actionForward,这5个名词可以构成一个小过程:客户端发送一个请求给服务器,服务器web.xml接收并分配给相应的servlet,这时的servlet就是struts.xml里面的actionServlet,actionServlet根据URL来截取配置信息,这些配置信息在actionMapping里面,然后生成相应的actionForm与action,actionForm里面放置的用户的请求信息,action实行控制,里面有个execute()方法,可以实行相应的操作,此时也可以进入逻辑业务(也就是调用Model层),最后以返回的参数实行actionForward来生成新的jsp界面,此时也可以不生成新的jsp界面,这种情况是我在做ajax异步时发现的,此时struts.xml里面的代码如下

<action name="loginPro" class="org.crazyit.app.action.LoginAction">
<result name="success" type="stream">
<!-- 指定下载文件的文件类型 -->
<param name="contentType">text/html</param>
<!-- 指定由getResult()方法返回输出结果的InputStream -->
<param name="inputName">result</param>
</result>
</action>

此时通过使用stream类型的Result,Strut2可以无需jsp视图界面,直接在Action向浏览者生成指定的响应。更深层不生成新的jsp界面的一个就是还利用了json,此时得引入struts2-json-plugin-2.3.15.1.jar包,也对struts.xml文件有着一定的修改,如下:

<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<include file="struts-plugin.xml" />
<package name="ynwi" extends="json-default">
<action name="s2AA" class="s2AAa">
<result type="json">
<!-- 为该Result指定参数 -->
<param name="noCache">true</param>
<param name="contentType">text/html</param>
</result>
</action>

  上面说到action的5个名词时小谈了下SSH中一小部分的运行,下面我接着说,request有两种传值(就是actionForm)方式(在java文件里面以setter来获取这些信息),一种是get,这种方式传值时特点是会在地址栏后面加上你要传这值,这容易看出这种传值方式不安全与传的值量不大,另一种是form传值,是比较常用的传值方式,就是生成表格来存取数据,可以存储的数据量也比较大。

  当我们按jsp界面的按钮时,我们便直接来到struts.xml里面吧,我们根据action中的name来对应我们应该响应的action事件,class为指定的action的java类,如果此时不是指定java类,而是以一个名字指定到applicationContext.xml文件里面的话,这时就是说明进入了逻辑层了,此时action的java类为applicationContext.xml文件里面以那名字命名的bean的class,这个过程呢,我们叫他做“让spring来管理控制器”,此时主要内容如下:

struts.xml里面:

<action name="Login" class="userLogin">
<result name="admin">/index.jsp</result>
<result name="customer">/Success_Customer.jsp</result>
<result name="error">/Fail.jsp</result>
</action>

applicationContext.xml里面:

<bean id="userLogin" class="com.slt.ssh.action.userLoginAction">
<property name="userManager">
<ref bean="userManager"></ref>
</property>
</bean>

另外还有一种方式叫做“自动装配”,这个先上代码我再说一下

struts.xml里面:

<action name="loginPro"
class="org.crazyit.app.action.LoginAction">
<!-- 为两个逻辑视图配置视图页面 -->
<result name="error">/WEB-INF/content/error.jsp</result>
<result name="success">/WEB-INF/content/welcome.jsp</result>
</action>

applicationContext.xml里面:

<bean id="ms"
class="org.crazyit.app.service.impl.MyServiceImpl"/>

LoginAction.java里面:

private MyService ms;
public void setMs(MyService ms)
{
this.ms = ms;
}

自动装配就是以applicationContext.xml来自动找java文件里面的setMs方法。

  现在,我们已经开始慢慢进入spring了,applicationContext.xml就是spring里面的知识点。@左潇龙博友说得好:“更准确的可以说spring是一个应用平台,可以这么理解spring就是操作系统,hibernate、struts都是网卡、显卡等插件,可插拔。操作系统管理着硬件,spring管理着这些hibernate持久层的ORM框架或者strutsMVC等框架。”对于spring,我认为最主要的知识就是AOP与IoC了,AOP简单理解就是给程度增加统一的功能的技术,是在不修改源代码的情况下,在通过编译或运行期动态代码的情况下。IoC(控制反转)简单理解就是把调用者的控制权交给第三方。IoC里面有许多概念:依赖,依赖倒置,依赖注入。

  依赖:.java文件中如果A类有在自己的方法中实例化B类,那么就说A依赖于B。

  依赖倒置:进行解耦,主要有两个原则

    1、上级不能依赖于下级,可以共同依赖于另一抽象类(这里就是引进了接口,接口属于抽象类)。

    2、抽象类不能依赖于实体类。

  依赖注入:就是在spring容器中实例化的内容注入到.java文件中。依赖注入里面有两种,一种是设值注入,另一种是构造注入。我们用得多的是设值注入。

    设值注入,先上主要代码再说明:

Chinese.java

private Axe axe;
//设值注入所需的setter方法
public void setAxe(Axe axe)
{
this.axe = axe;
}

applicationContext.xml

<bean id="chinese" class="org.crazyit.app.service.impl.Chinese">
<!-- 将stoneAxe注入给axe属性 -->
<property name="axe" ref="stoneAxe"/>
</bean>
<!-- 配置stoneAxe实例,其实现类是StoneAxe -->
<bean id="stoneAxe" class="org.crazyit.app.service.impl.StoneAxe"/>

我们可以看到xml文件时面property中的name为axe与java文件里面的setAxe相对应,这时也就是说我们把ref后面的stoneAxe注入给了java文件了,也就是说此时我们做的是在Chinese.java对StoneAxe类进行实例化,这样达到了松耦合的原理。

  构造注入,这个就简单地上下代码吧。

Chinese.java

    //构造注入所需的带参数的构造器
public Chinese(Axe axe)
{
this.axe = axe;
}

applicationContext.xml

<bean id="chinese" class="org.crazyit.app.service.impl.Chinese">
<!-- 使用构造注入,为chinese实例注入steelAxe实例 -->
<constructor-arg ref="steelAxe"/>
</bean>

  上面所说到的师兄叫我把查询语句写在manager里面,我不愿意的原因也有个感觉就是总觉得这样做不符合ioc,就是我会把applicationContext.xml看成是第三方,manager看成是调用者,dao看成是实现层,ioc不就是把实现层的控制权给第三方来控制吗?如果没了dao这一层,那这不就是不符合ioc了吗?后来慢慢觉得可不可以这样子看呢,就是把action看到是调用者,把manager看成是实现层,好像这样子想还真感觉有点道理,就是网上看了别人的都不是这样子的,奇怪奇怪,到现在还是感觉怪怪的。

  下面我们回到从struts进入到spring后,一开始的进入是以“让spring管理控制器”的方式进入的,进入后都是通过ref来连接用到了多个bean,这样子就会有可能进入到逻辑层(manager),数据接口层(dao),在spring整合了hibernate与struts后,我们也是把连接数据源写在了applicationContext.xml文件里面,例如factory,session等。

  另外我们要用到spring中的bean,也可以用ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、XmlWebApplicationContext来获取bean.

  在逻辑业务的控制下,我们进入了hibernate,hibernate就是以数据库相关连,对于hibernate的一对一,一对多等等的关联映射,我真心还没搞懂,对于注释,我也就懂了一点而已,至少还知道.hbm.xml文件主要用来对应数据库表里面的字节吧。不过hibernate我还是懂得查询是要建立工厂sessionfactory生产会议session等,在查询后还要关闭这会session什么的,但是我们现在有个getHibernateTemplate()函数,这是已经封装好的函数,我们直接用就行了,省了很多步骤。一般我们查询出来的结果以List来返回,当然也可以用别的东东来返回。

  返回到action的java文件后,再传值给struts.xml文件,这时struts.xml会根据传回来的值生成一个新的页面。

 
 
分类: SSH
标签: SSH

认知的SSH的更多相关文章

  1. 我现所认知的SSH

    实习了三个月,对着SSH有着一定的认识了,就以自已认识的大概思路写一篇文章吧,留给以后的自已,也恳请各位博友们如果看到我的认识有过错的地方能帮我指正过来! 我用到的资料 在写正文之前,先说说我这段时间 ...

  2. 学习SSH框架

    1.SSH框架的认知 在做相关的java的网页的开发制作时,良好的层次分解是十分有比要的,所以我们在云涌第三方的框架之下来简化还有名了我们相关的网站的开发. SSH框架实则为Struct + spri ...

  3. 网络数据传输安全及SSH与HTTPS工作原理

    本节内容 网络数据传输安全概述 数据加密算法分类 SSH工作原理 HTTPS工作原理 参考资料 个人一直在努力推动git在公司内部的普及和使用,前些日子在公司内部做了一次分享课,给大家介绍了下项目发布 ...

  4. Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载

    Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载 2018年5月26日 19:03 阅读 375 评论 7 我本地和服务器的连接一直使用的是 Xshell 5,而在与服务 ...

  5. Git服务器搭建--ssh/http

    测试环境 Windows 7 Ultimate, 64-bit 6.1.7601, Service Pack 1(实体机,虚拟机VMware的宿主机) VMware® Workstation 7.1. ...

  6. 如何搭建一个WEB服务器项目(一)—— 开篇 ,搭建SSH整合框架

    使用Intellij IDEA2019创建SSH(Spring+SpringMVC+Hibernate+Maven整合)项目 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解, ...

  7. [linux]阿里云主机的免登陆安全SSH配置与思考

    公司服务器使用的第三方云端服务,即阿里云,而本地需要经常去登录到服务器做相应的配置工作,鉴于此,每次登录都要使用密码是比较烦躁的,本着极速思想,我们需要配置我们的免登陆. 一 理论概述 SSH介绍 S ...

  8. SSH实战 · 唯唯乐购项目(上)

    前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...

  9. 记录一则Linux SSH的互信配置过程

    需求:四台Linux主机,IP地址为192.168.10.10/11/12/13,配置登录用户的互信 1.各节点ssh-keygen生成RSA密钥和公钥 ssh-keygen -q -t rsa -N ...

随机推荐

  1. 至尊快速,国产语言RPP 1.83强势来袭

    以下是 R++的性能測试数据:(奔腾 1.86GHZ,測试 3 次取平均值) 执行效率: R++的内部结构和 C++大致同样,所以理论上 R++能够达到和 C++一样的执行速度,眼下 R++已开启汇编 ...

  2. 【高德地图API】从零开始学高德JS API(八)——地址解析与逆地址解析

    原文:[高德地图API]从零开始学高德JS API(八)——地址解析与逆地址解析 摘要:无论是百度LBS开放平台,还是高德LBS开放平台,其调用量最高的接口,必然是定位,其次就是地址解析了,又称为地理 ...

  3. JDBC加载过程

    jdbc载入的过程如图所看到的. 桥接模式请參照:设计模式:桥接模式 blog目的:与图说话 版权声明:本文博客原创文章,博客,未经同意,不得转载.

  4. vs2012连接sql2008(错误类型:Could not load file or assembly)

    发生错误: Sql Server2008数据库中有一个数据库. 我想ORM-Entity FrameWork技术,在自己主动了一个项目,建立一个实体类! 解决的方法: 出现上面的情况.是由于缺少了这两 ...

  5. Hack 语言学习/参考---1.Hack 语言

    Table of Contents What is Hack? Hack Background Summary Hack is a language for HHVM that interopates ...

  6. Unofficial Microsoft SQL Server Driver for PHP (sqlsrv)非官方的PHP SQL Server 驱动

    原文 Unofficial Microsoft SQL Server Driver for PHP (sqlsrv) Here are unofficial modified builds of Mi ...

  7. 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例(原创)

    天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...

  8. high performance program (SSE4.2 intrin instruction)

    In file included from mm_lddqu.si128.c:2:0: /usr/local/lib/gcc/x86_64-redhat-linux/4.7.1/include/nmm ...

  9. oracle 创建用户,授权用户,创建表,查询表

    原文:oracle 创建用户,授权用户,创建表,查询表 oracle 创建用户,授权用户,创建表,查询表 假设oracle10g所有的都已经安装和配置好 第一步:win+R,进入运行,cmd; 第二步 ...

  10. jQuery的ready方法实现原理分析

    jQuery中的ready方法实现了当页面加载完成后才执行的效果,但他并不是window.onload或者doucment.onload的封装,而是使用 标准W3C浏览器DOM隐藏api和IE浏览器缺 ...