【SSH进阶之路】Struts基本原理 + 实现简单登录(二)

上面博文,主要简单的介绍了一下SSH的基本概念,比较宏观,作为初学者能够有一个整体上的认识,个人认为对学习有很好的辅助功能,它不仅仅是一个“瞭望塔”,更是检验是否真正掌握所有内容的一个前提。

      Struts是基于MVC的框架,它进一步的对MVC进行了封装,它是怎么封装的,我们从先回顾一下MVC再到Struts,再用Struts给大家实现一个简单登录的实例。我们开始吧。


MVC


概念


       MVC全名是Model View Controller,是模型(model)—视图(view)—控制器(controller)的缩写,知道这么多就够了。


      大家都知道SUN公司对于MVC模式先后推出的一种规范,第一种是JSP Model1,第二种则是JSP Model2;Model1就是jsp + javabean,Model2就是jsp + servlet + javabean两种模式,前者是纯JSP,后者是简单的MVC。我们通过两个时序图来对比一下Model1和Model2:


Model1




优点:

1、编码简单

2、适合小型项目

 

缺点:

1、显示层与业务逻辑混在一起

2、jsp的职责不单一,职责过重,不便于维护


Model2



 

优点:

1、分层清晰,职责清楚,比较适合于大型项目架构

2、可扩展性强

3、实现了业务逻辑和显示分离,降低系统的耦合度


缺点:

1、增加了大量编写代码的工作量


对比


        Model1在一定程序上实现了MVC,即JSP是控制层与表示层合二为一了,这样的效果显然不如将控制层单独划分出来的好。而Model2则是将控制层(sevlet)单独的划分出来了,专门负责业务流程的控制,接受页面的请求,创建所需的javabean实例,并将处理后的数据再返回给JSP,渲染页面,这样分层清晰,可扩展性强,降低系统的耦合度。


Struts1


概念


       说概念真谈不上,Struts实质上就是采用JavaServlet/JSP技术,在Model2的基础上实现的一个MVC框架。


Struts1实现MVC的模型图


         


各部分的职责


虽然说Struts不难,但对于初学者而言,真正的弄明白Struts也是一件很简单的事,我们介绍一下几个关键点的职责,以便对struts的原理有更进一步的认识。


ActionServlet,前端控制器

1、根据相应的规则截取Http请求的URL

2、将Http请求分发到相应的Action处理


ActionForm,相当于实体

1、收集表单数据,将表单数据转换成相应的数据类型


Action,业务层控制器

1、 取得表单数据
2、调用业务逻辑
3、返回转向信息


我们再根据登录实例,对比上面的模型图,进一步理解一下Struts的基本原理,最后做一下总结。

 

登录实例


1、配置Struts

*拷贝struts相关的jar到WEB-INF/lib下
*在web.xml文件中配置ActionServlet
*提供struts-config.xml文件,需要放到WEB-INF下

如图所示:

         

2、编写代码


web.xml

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  3.     xmlns="http://java.sun.com/xml/ns/javaee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  7.   <welcome-file-list>  
  8.     <welcome-file>index.jsp</welcome-file>  
  9.   </welcome-file-list>  
  10.     
  11.   <!-- 标准 ActionServlet 配置文件-->  
  12.   <servlet>  
  13.     <servlet-name>action</servlet-name>  
  14.     <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>  
  15.     <init-param>  
  16.       <param-name>config</param-name>  
  17.       <param-value>/WEB-INF/struts-config.xml</param-value>  
  18.     </init-param>  
  19.     <init-param>  
  20.       <param-name>debug</param-name>  
  21.       <param-value>2</param-value>  
  22.     </init-param>  
  23.     <init-param>  
  24.       <param-name>detail</param-name>  
  25.       <param-value>2</param-value>  
  26.     </init-param>  
  27.     <load-on-startup>2</load-on-startup>  
  28.   </servlet>  
  29.   
  30.   
  31.   <!-- 标准 ActionServlet Mapping配置信息 -->  
  32.   <servlet-mapping>  
  33.     <servlet-name>action</servlet-name>  
  34.     <url-pattern>*.do</url-pattern>  
  35.   </servlet-mapping>  
  36.     
  37. </web-app>  

struts-config.xml

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="ISO-8859-1" ?>  
  2.   
  3. <!DOCTYPE struts-config PUBLIC  
  4.           "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"  
  5.           "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">  
  6.   
  7. <struts-config>  
  8.     <form-beans>  
  9.         <form-bean name="loginForm" type="com.liang.struts.LoginActionForm"></form-bean>  
  10.     </form-beans>  
  11.       
  12.     <action-mappings>  
  13.         <action path="/login"   
  14.                 type="com.liang.struts.LoginAction"  
  15.                 name="loginForm"  
  16.                 scope="request"  
  17.                 >  
  18.             <forward name="success" path="/login_success.jsp"></forward>  
  19.             <forward name="error" path="/login_error.jsp"></forward>  
  20.         </action>  
  21.     </action-mappings>  
  22. </struts-config>  

LoginAction

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.liang.struts;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5.   
  6. import org.apache.struts.action.Action;  
  7. import org.apache.struts.action.ActionForm;  
  8. import org.apache.struts.action.ActionForward;  
  9. import org.apache.struts.action.ActionMapping;  
  10. /** 
  11.  * 登录Action 
  12.  * 负责取得表单数据,调用业务逻辑,返回转向信息 
  13.  * @author liang 
  14.  * 
  15.  */  
  16. public class LoginAction extends Action {  
  17.   
  18.     @Override  
  19.     public ActionForward execute(ActionMapping mapping, ActionForm form,  
  20.             HttpServletRequest request, HttpServletResponse response)  
  21.             throws Exception {  
  22.         LoginActionForm laf =(LoginActionForm)form;  
  23.         //从ActionForm获取表单数据  
  24.         String username = laf.getUsername();  
  25.         String password = laf.getPassword();  
  26.         UserManager userManager = new UserManager();  
  27.         try{  
  28.             //调用业务逻辑  
  29.             userManager.login(username, password);  
  30.             //跳转到成功页面  
  31.             return mapping.findForward("success");  
  32.         }catch(UserNotFoundException e){  
  33.             e.printStackTrace();  
  34.             request.setAttribute("msg""用户不能找到,用户名称=[" + username + "]");  
  35.         }catch(PasswordErrorException e){  
  36.             e.printStackTrace();  
  37.             request.setAttribute("msg""密码错误");  
  38.         }  
  39.         //跳转到失败页面  
  40.         return mapping.findForward("error");  
  41.     }  
  42.   
  43. }  


LoginActionForm

[java]  view plain copy print ?
  1. package com.liang.struts;  
  2.   
  3. import org.apache.struts.action.ActionForm;  
  4. /** 
  5.  * 登录ActionForm,负责表单收集数据 
  6.  * 表单的属性必须和ActionForm中的get和set的属性一致 
  7.  * @author liang 
  8.  * 
  9.  */  
  10. @SuppressWarnings("serial")  
  11. public class LoginActionForm extends ActionForm {  
  12.       
  13.     private String username;  
  14.       
  15.     private String password;  
  16.       
  17.     public String getUsername() {  
  18.         return username;  
  19.     }  
  20.     public void setUsername(String username) {  
  21.         this.username = username;  
  22.     }  
  23.     public String getPassword() {  
  24.         return password;  
  25.     }  
  26.     public void setPassword(String password) {  
  27.         this.password = password;  
  28.     }  
  29. }  


login.jsp

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <%@ page language="java" contentType="text/html; charset=GB18030"  
  2.     pageEncoding="GB18030"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=GB18030">  
  7. <title>Insert title here</title>  
  8. </head>  
  9. <body>  
  10.     <form action="login.do" method="post">  
  11.         用户:<input type="text" name="username"><br>  
  12.         密码:<input type="password" name="password"><br>  
  13.         <input type="submit" value="登录"><br>  
  14.     </form>  
  15. </body>  
  16. </html>  

PS:登录页面不难,主要是一定注意action的名字和ActionServlet的配置一致。


总结


       Struts很好的封装了MVC,界面从业务逻辑分离出来,灵活多变,同时,使用配置文件将控制层也变得更加灵活,降低了系统耦合。大道至简,一切变得轻松,简单了。


源码


留个悬念,下篇博文,我们一步步重构MVC实现Struts框架的流程。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SSH免密登录的原理是利用SSH公钥认证机制,即在客户端生成公钥和私钥,将公钥传输到服务器端,并将私钥保存在客户端。当客户端连接服务器时,服务器会向客户端发起挑战,客户端使用私钥对挑战进行签名,并将签名返回给服务器,服务器使用之前保存的公钥进行验证,验证通过后即可免密登录。 以下是实现SSH免密登录的步骤: 1. 在客户端上使用ssh-keygen命令生成公钥和私钥,命令格式如下: ``` ssh-keygen -t rsa ``` 2. 将生成的公钥传输到服务器端,可以使用ssh-copy-id命令,命令格式如下: ``` ssh-copy-id user@server ``` 这将会把公钥复制到服务器的~/.ssh/authorized_keys文件中。 3. 在客户端上保存私钥文件,通常保存在~/.ssh目录下。 4. 确保服务器端配置文件/etc/ssh/sshd_config中的PubkeyAuthentication参数为yes,表示启用公钥认证。 5. 确认客户端和服务器端的ssh服务都已经启动,然后就可以尝试使用ssh命令连接服务器,此时就不需要输入密码了。 ``` ssh user@server ``` 注意事项: 1. 在使用ssh-keygen生成公私钥时,可以根据需要设置密码,加强私钥的安全性。 2. 在使用ssh-copy-id将公钥复制到服务器端时,需要输入密码。 3. 为了安全起见,建议只将公钥复制到需要免密登录的服务器上。如果需要在多台服务器之间进行免密登录,需要在每台服务器上重复执行以上步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值