【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的模型图
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaml1cWl5dWxpYW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">
各部分的职责
尽管说Struts不难。但对于刚開始学习的人而言。真正的弄明确Struts也是一件非常easy的事,我们介绍一下几个关键点的职责,以便对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下
如图所看到的:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaml1cWl5dWxpYW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">
2、编写代码
web.xml
<? xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> <!-- 标准 ActionServlet 配置文件-->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet> <!-- 标准 ActionServlet Mapping配置信息 -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping> </web-app>
struts-config.xml
<? xml version="1.0" encoding="ISO-8859-1" ? > <!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"> <struts-config>
<form-beans>
<form-bean name="loginForm" type="com.liang.struts.LoginActionForm"></form-bean>
</form-beans> <action-mappings>
<action path="/login"
type="com.liang.struts.LoginAction"
name="loginForm"
scope="request"
>
<forward name="success" path="/login_success.jsp"></forward>
<forward name="error" path="/login_error.jsp"></forward>
</action>
</action-mappings>
</struts-config>
LoginAction
package com.liang.struts; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
/**
* 登录Action
* 负责取得表单数据,调用业务逻辑,返回转向信息
* @author liang
*
*/
public class LoginAction extends Action { @Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
LoginActionForm laf =(LoginActionForm)form;
//从ActionForm获取表单数据
String username = laf.getUsername();
String password = laf.getPassword();
UserManager userManager = new UserManager();
try{
//调用业务逻辑
userManager.login(username, password);
//跳转到成功页面
return mapping.findForward("success");
}catch(UserNotFoundException e){
e.printStackTrace();
request.setAttribute("msg", "用户不能找到。用户名称=[" + username + "]");
}catch(PasswordErrorException e){
e.printStackTrace();
request.setAttribute("msg", "密码错误");
}
//跳转到失败页面
return mapping.findForward("error");
} }
LoginActionForm
package com.liang.struts; import org.apache.struts.action.ActionForm;
/**
* 登录ActionForm,负责表单收集数据
* 表单的属性必须和ActionForm中的get和set的属性一致
* @author liang
*
*/
@SuppressWarnings("serial")
public class LoginActionForm extends ActionForm { private String username; private String password; public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
login.jsp
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
<form action="login.do" method="post">
用户:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录"><br>
</form>
</body>
</html>
PS:登录页面不难,主要是一定注意action的名字和ActionServlet的配置一致。
总结
Struts非常好的封装了MVC,界面从业务逻辑分离出来,灵活多变,同一时候,使用配置文件将控制层也变得更加灵活,减少了系统耦合。大道至简,一切变得轻松。简单了。
留个悬念。下篇博文,我们一步步重构MVC实现Struts框架的流程。
【SSH进阶之路】Struts基本原理 + 实现简单登录(二)的更多相关文章
- Struts基本原理 + 实现简单登录(二)
MVC 概念 MVC全名是Model View Controller,是模型(model)—视图(view)—控制器(controller)的缩写,知道这么多就够了. 大家都知道SUN公司对于MVC模 ...
- 【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)
[SSH进阶之路]Struts + Spring + Hibernate 进阶开端(一) 标签: hibernatespringstrutsssh开源框架 2014-08-29 07:56 9229人 ...
- 【SSH进阶之路】Hibernate搭建开发环境+简单实例(二)
Hibernate是很典型的持久层框架,持久化的思想是很值得我们学习和研究的.这篇博文,我们主要以实例的形式学习Hibernate,不深究Hibernate的思想和原理,否则,一味追求,苦学思想和原理 ...
- 【SSH进阶之路】一步步重构容器实现Spring框架——彻底封装,实现简单灵活的Spring框架(十一)
文件夹 [SSH进阶之路]一步步重构容器实现Spring框架--从一个简单的容器開始(八) [SSH进阶之路]一步步重构容器实现Spring框架--解决容器对组件的"侵入 ...
- SSH进阶之路
[SSH进阶之路]Hibernate基本原理(一) 在开始学Hibernate之前,一直就有人说:Hibernate并不难,无非是对JDBC进一步封装.一句不难,难道是真的不难还是眼高手低 ...
- 【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)
[SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,採用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...
- 【SSH进阶之路】Hibernate基本映射(三)
[SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心.採用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...
- 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)
[SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,採用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...
- 【SSH进阶之路】Hibernate系列——总结篇(九)
这篇博文是Hibernate系列的最后一篇,既然是最后一篇,我们就应该进行一下从头到尾,整体上的总结,将这个系列的内容融会贯通. 概念 Hibernate是一个对象关系映射框架,当然从分层的角度看,我 ...
随机推荐
- Flask实战第52天:cms添加轮播图前端代码逻辑完成
首页我们在模态框中的保存按钮加一个id,这样方便我们选取这个按钮 <button type="button" class="btn btn-primary" ...
- BZOJ 2084 [Poi2010]Antisymmetry(manacher)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2084 [题目大意] 对于一个01字符串,如果将这个字符串0和1取反后, 再将整个串反过 ...
- 【数论】nefu119 组合素数
算组合数中的素因子p的个数,基本同这题 http://www.cnblogs.com/autsky-jadek/p/6592194.html #include<cstdio> using ...
- http请求 url 传递参数(特殊字符)解决方法
有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.下表中列出了一些URL特殊符号及编码 十六进制值 1. + URL 中+号表示空格 %2B ...
- ArrayList之扩容与迭代器
1. 扩容 ArrayList扩容包括ensureCapacity(对外开放)和ensureCapacityInternal(内部隐式调用)两个接口: 1' 两者都调用ensureExplicitCa ...
- sql server 2012 登录失败出现10048错误
好久没用sql server了,今天登录我的一个数据库中的时候突然登录不了,账号密码没有错,到服务中看的时候看到我那个数据库没有启动,心想启动应该就好了. 然后出现了这个错误,度娘了一下,网上大家的方 ...
- convirt介绍
convirt2.0是一款使用python和jquery结合编写的其于web的集中管理xen服务的程序.该程序在xen 社区项目,管理项目中被使用的量很高,convirt开发有开源版本与企业版本,企业 ...
- Linux中KVM虚拟机是什么
概念: Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中.它使用Linux自身的调度器进行 ...
- Web安全开发指南--数据验证
1.数据验证 4.1.输入数据验证安全规则 1 数据验证必须放在服务器端进行. 2 至少对输入数据的数据类型.数据范围和数据长度进行验证. 3 所有来自不可信数据源(比如网络.用户命令.数据库和文件系 ...
- (转)DLL中导出函数的两种方式(dllexport与.def文件)
DLL中导出函数的两种方式(dllexport与.def文件)http://www.cnblogs.com/enterBeijingThreetimes/archive/2010/08/04/1792 ...