1、MVC
1.1 Model1 和Model2
Model 1 :整个web应用几乎全部在jsp页面上处理,页面身兼view和controller的角色。代码重用度低,扩展和维护难度较大,适用于小型的web站点。
Model2:是基于MVC的设计模式。Servlet作为前端控制器,负责接收客户端发送的请求。Servlet包含控制逻辑和简单的前端处理,然后调用后端的javaBean来完成实际的逻辑处理,最后转发到相应的jsp页面。
1.2 MVC是三个单词的缩写,分别为: 模型(Model),视图(View)和控制Controller)。 MVC模式的目的就是实现Web系统的职能分工。Model层实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现。View层用于与用户的交互,通常用JSP来实现。Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。
MVC特点:
(1)多个视图可以对应一个模型。
(2)模型返回的数据与现实逻辑分离。
2、在Eclipse中使用Struts2
(1)代码结构
LoginAtion.java
package org.crazyit.app.action;
import com.opensymphony.xwork2.*;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.*;
import javax.servlet.http.*;
import java.util.Map;
public class LoginAction implements Action
// ,ServletResponseAware
{
private String username;
private String password;
// private HttpServletResponse response;
// username的setter和getter方法
public void setUsername(String username)
{
this.username = username;
}
public String getUsername()
{
return this.username;
}
// password的setter和getter方法
public void setPassword(String password)
{
this.password = password;
}
public String getPassword()
{
return this.password;
}
public String execute() throws Exception
{
ActionContext ctx = ActionContext.getContext();
// 通过ActionContext访问application范围的属性值
Integer counter = (Integer)ctx.getApplication()
.get("counter");
if (counter == null)
{
counter = 1;
}
else
{
counter = counter + 1;
}
// 通过ActionContext设置application范围的属性
ctx.getApplication().put("counter" , counter);
// 通过ActionContext设置session范围的属性
ctx.getSession().put("user" , getUsername());
if (getUsername().equals("hhp")
&& getPassword().equals("hhp") )
{
// 通过ActionContext设置request范围的属性
ctx.put("tip" , "服务器提示:您已经成功的登录");
Cookie c = new Cookie("user", getUsername());
c.setMaxAge(60*60);
// response.addCookie(c);
ServletActionContext.getResponse().addCookie(c);
return SUCCESS;
}
// 通过ActionContext设置request范围的属性
ctx.put("tip" , "服务器提示:登录失败");
return ERROR;
}
}
LoginForm.jsp
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>登录页面</title>
</head>
<body>
<form action="login.action" method="post">
<table align="center">
<caption><h3>用户登录</h3></caption>
<tr>
<td>用户名:<input type="text" name="username"/></td>
</tr>
<tr>
<td>密 码:<input type="text" name="password"/></td>
</tr>
<tr align="center">
<td><input type="submit" value="登录"/><input type="reset" value="重填" /></td>
</tr>
</table>
</form>
</body>
</html>
Struts.xml
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="conststruts.devMode" value="true"/>
<!-- Struts2的所有Action都需位于package下 -->
<package name="lee" extends="struts-default">
<!-- 定义名为login的Action,其实现类为LoginAction类 -->
<action name="login" class="org.crazyit.app.action.LoginAction">
<!-- 处理结果返回error,对应/WEB-INF/content/error.jsp视图资源 -->
<result name="error">/WEB-INF/content/error.jsp</result>
<!-- 处理结果返回success,对应/WEB-INF/content/welcome.jsp视图资源 -->
<result>/WEB-INF/content/welcome.jsp</result>
</action>
<action name="*">
<!-- -->
<result>/WEB-INF/content/{1}.jsp </result>
</action>
</package>
</struts>
3、Struts2工作流程
1. 客户端发送请求的tomcat服务器。服务器接受,将HttpServletRequest传进来。
2. 请求经过一系列过滤器(如:ActionContextCleanUp、SimeMesh等)
3. FilterDispatcher被调用。FilterDispatcher调用ActionMapper来决定这个请求是否要调用某个Action
4. ActionMapper决定调用某个ActionFilterDispatcher把请求交给ActionProxy
5. ActionProxy通过ConfigurationManager查看struts.xml,从而找到相应的Action类
6. ActionProxy创建一个ActionInvocation对象
7. ActionInvocation对象回调Action的execute方法
8. Action执行完毕后,ActionInvocation根据返回的字符串,找到对应的result。然后将Result内容通过HttpServletResponse返回给服务器。