实习了三个月,对着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,也上传了份在百度云上面,有需要的博友可以点击此下载

我此时的SSH框架

Struts2

  先从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>

  

requery传值

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

进入spring知识

  当我们按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>   <bean id="steelAxe" class="org.crazyit.app.service.impl.SteelAxe"/>

参杂着hibernate

  上面所说到的师兄叫我把查询语句写在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的更多相关文章

  1. 认知的SSH

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

  2. python下ssh的简单实现

    python下的ssh都需要借助第三方模块paramiko来实现,在使用前需要手动安装. 一.python实现ssh (1) linux下的ssh登录 root@ubuntu:~# ssh morra ...

  3. Ubuntu使用ssh公钥实现免密码登录

    ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以Ubuntu为例. 有机器A(10.0.2.1),B(10.0.2.100).现想A通过ssh免密 ...

  4. ssh免密码认证

    举例:有机器PC_A(172.0.246),PC_B(172.0.1.140).现想A通过ssh免密码登录到B. 1.在PC_A主机下生成公钥/私钥对 [comodo@PC_A ~]$ ssh-key ...

  5. Linux使用ssh公钥实现免密码登录Linux

    ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例.有机器A(192.168.1.155),B(192.168.1.181).现想A ...

  6. ssh免密码登录机器(使用公钥和秘钥进行加密来实现)

    ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例. 登录的原理: 有机器A(192.168.1.155),B(192.168.1. ...

  7. SSH 无密码远程执行脚本

    ssh无密码登录及远程执行脚本要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS7为例. 测试环境:机器A(10.0.224.80):机器B(192.16 ...

  8. ssh免密码登陆及其原理

    ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例. 有机器A(192.168.1.155),B(192.168.1.181).现想 ...

  9. ssh 无密码登录

    ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例. 有机器A(192.168.1.155),B(192.168.1.181).现想 ...

随机推荐

  1. 包学会之浅入浅出Vue.js:开学篇(转)

    包学会之浅入浅出Vue.js:开学篇 蔡述雄,现腾讯用户体验设计部QQ空间高级UI工程师.智图图片优化系统首席工程师,曾参与<众妙之门>书籍的翻译工作.目前专注前端图片优化与新技术的探研. ...

  2. linux sed文本

    sed介绍 sed(stream editor)是一种非交互式的流编辑器,通过多种转换修改流经它的文本.默认情况下,sed不会改变原文件本身,而只是对流经sed命令的文本进行修改,并将修改后的结果打印 ...

  3. Apache 的 ab 压测工具快速使用

    ab 是一个 httpd 自带的很好用的压力测试工具,它是 apache bench 命令的缩写.ab 命令会创建多个并发访问线程,模拟多个访问者同时对某一 URL 地址进行访问.可以用来测试 apa ...

  4. P1858 多人背包

    P1858 多人背包 题目描述 求01背包前k优解的价值和 要求装满 调试日志: 初始化没有赋给 dp[0] Solution 首先补充个知识点啊, 要求装满的背包需要初始赋 \(-inf\), 边界 ...

  5. spring cloud 微服务架构 简介

     Spring Cloud 1. Spring Cloud 简介 Spring Cloud是在Spring Boot的基础上构建的,用于简化分布式系统构建的工具集,为开发人员提供快速建立分布式系统中的 ...

  6. Solr记录-solr文档xml

    Solr添加文档(XML) 在上一章中,我们学习解释了如何向Solr中添加JSON和.CSV文件格式的数据.在本章中,将演示如何使用XML文档格式在Apache Solr索引中添加数据. 示例数据 假 ...

  7. ASP.NET MVC学习笔记-----ControllerFactory

    上面这张图是asp.net mvc的工作流程图,我们可以看到当一个http请求来临时,首先需要经过路由系统,路由系统从中获取一些路由信息,然后ControllerFactory根据所得到的路由信息生成 ...

  8. shell 判断路径

    判断路径 ];then echo "找到了123" if [ -d /root/Desktop/text ] then echo "找到了text" else ...

  9. MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇

    Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去,欢迎建议和指导):https://github.com/Snailclimb/Java_Guide 一 MyISAM 1.1 My ...

  10. css部分复习整理

    CSS代码语法 css 样式由选择符和声明组成,而声明又由属性和值组成,如下图所示: 选择符:又称选择器,指明网页中要应用样式规则的元素,如本例中是网页中所有的段(p)的文字将变成蓝色,而其他的元素( ...