Struts2框架是mvc思想的具体实现,那么mvc是什么?
1.MVC
Model 模型 团队
View 视图
Controller 控制 前端控制器
什么是mvc设计模式?
MVC把应用程序分成3个核心模块:模型(Model)、视图(View)和控制器(Controller),它们分别担当不同的任务
首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理
然后模型根据用户请求进行相应的业务逻辑处理,并返回数据
最后控制器调用相应的视图格式化模型返回的数据,并通过视图呈现给用户。
Mvc优点:
1.把业务处理和流程控制等代码混杂在一起进行分离,降低了程序模块之间的耦合度,利于系统的维护。
2.由于一个模型可以为多个视图公用,导致客户需要不同视图展现的时候不需要重复写逻辑代码,可以重复利用现有的模型。提高了代码的复用。
2。Struts2—mvc的优秀代表
一些基本概念
包的概念
使用package可以管理Action和Interceptor等。
package的属性
name:这是一个必填属性,该属性指定该包的名字,该名字是该包被其它包引用的 key。
名字随便起一个逻辑名称,名称原则上应该和功能有关。
extends:可选属性。指定该包继承其它包。继承其它包,可以继承其它包中的 Action 定义。一般继承struts-default包
abstract:可选属性。指定该包是不是一个抽象包。抽象包中不能包含 Action 定义。
namespace:可选属性。指定包的命名空间。影响访问该包下的Action的路径。 名字最好和包名一致。但是注意以斜杠开始。
访问一个action,具体路径:http://localhost:8081/项目名+namespace+”/”+login
Login:action标签的name属性值。
Action的配置
Action是struts2的基础的“工作单元”。
配置一个基本的Action只需要两个信息:
name : Action类的映射名称
class : Action类
默认调用Action类的execute()方法
可以使用method属性来告诉struts2调用Action类的哪个方法
<action name=“userLogin” class=“action.UserLogin” >
<result name="ok">/ok.jsp</result>
<result name="error">/error.jsp</result>
<result name="doAdd">/hello.jsp</result>
</action>
请求方式有三种:
1. action加上method属性
2.官方不推荐:
/hello.jsp
/success.jsp
/login.jsp
/test.jsp
URL写法:namespace名称+/+action的名字+!+method=hello
3. 用通配符
/hello.jsp
/success.jsp
/login.jsp
/test.jsp
Result配置
Result标签告诉struts2在Action调用完成后一下步做什么
结果以“key-value”的形式映射到结果类型
在struts.xml文件中定义 ,嵌套在标签中
Result标签常用属性
name : Result名称,默认 “success”
type : Result类型,表示跳转方式,默认值 “dispatcher”
dispatcher:表示服务器转发的方式
redirect:表示客户端重定向的方式
json
xml
默认是通过请求转发器实现的,相当于request.getRequestDispatcher()
一个struts2的开发步骤
1创建web项目,导入struts2的jar包
Jar包:
struts2-core-2.2.1.jar:Struts2框架的核心类库。
xwork-core-2.2.1.jar:Xwork核心类库,Struts2在其上构建。
ognl-3.0.jar:对象图导航语言(Object Graph Navigation Language),它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
freemarker-2.3.16.jar:Struts 2的UI标签的模板使用FreeMarker编写。
commons-fileupload-1.2.1.jar:文件上传组件,2.1.6版本后必须加入此文件。
commons-io-1.3.2.jar:IO输入输出流组件,主要完成文件的读写功能。
javassist-3.7.ga.jar:Javassist是一个开源的分析、编辑和创建Java字节码的类库。(在struts-2.2.1\apps\struts2-blank-2.2.1.war下的lib中找)
commons-logging-1.0.4.jar:ASF出品的日志包,Struts2框架使用这个日志包来支持Log4J和JDK 1.4版本之上的日志记录。
2 配置struts2的过滤器
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3 编写Action类
package action;
public class LoginAction {
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;
}
/**
* 登录
*/
public String login(){
if(username.equals("admin")&&password.equals("ok"))
{
return "success";
}
else{
return "fail";
}
}
}
4 创建struts.xml文件,注册Action类
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="user" namespace="/" extends="struts-default">
<action name="login" class="action.LoginAction" method="login" >
<result name="success">/success.jsp</result>
<result name="fail" type="dispatcher">/fail.jsp</result> <!-- 默认转发 dispatcher 重定向redirect-->
</action>
</package>
<!-- Add packages here -->
</struts>
5 创建JSP文件。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="login.action">
用户名:<input type="text" name="username"/><br>
密码:<input type="password" name="password"/><br>
<input type="submit" value="登录"/>
</form>
</body>
</html>
6 测试
测试
有3种访问方式:一种根据action配置的name name.action如果没有配置method属性默认会走execute方法。
另一种可以根据具体的method指定。动态方法调用:user!login.action
如果想要禁止这种动态调用,在xml文件设置:struts.enable.DynamicMethodInvocation = false
第三种通配符 *
/success.jsp
/fail.jsp
访问方式同第一种。Namespace/student_login.action
Action开发规范(顺嘴提一句,哪有那么多规范,我就不规范)
Action可以是一个单纯的类,默认调用execute()方法
为了让用户开发的Action类更规范,Struts2提供了一个Action接口,定义了Action类应该实现的规范
public interface Action {
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
public String execute() throws Exception;
}
但是我们一般会继承下面这个类:
public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable {
}
怎么拿到session和request等对象呢?(用来携带数据倒前端)
与Servlet解耦的方式
ActionContext context=ActionContext.getContext();
Map session=context.getSession();
Map request=(Map)context.get("request");
Map application=context.getApplication();
request.put("message", "chenggong zhuce");
request.put("user", user);
return "registerSuccess";
与Servlet 耦合的方式
HttpServletRequest request=ServletActionContext.getRequest();
HttpServletResponse response=ServletActionContext.getResponse();
request.setAttribute("message", "chenggong zhuce");
request.setAttribute("user", user);
HttpSession session=request.getSession();
ServletContext application=request.getServletContext();
耦合是什么意思不需要解释吧?所以推荐大家使用解耦方式
那么怎么获取前段传递来的数据呢?
获取页面传过来的参数方式是在action类配置私属性。也可以配置实体类属性
举个例子
Action代码: private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
Login.jsp:
用户名:<input type="text" name="user.username"/><br>
密码:<input type="password" name="user.password"/><br>
上面例子是在action里写了个实体对象,还可以写一个私有属性,
比如action里是private的String username,那么form表单name=“username”就拿到了呀,哈哈哈哈哈。。。。。。
Struts2就这么简单?难的看下一篇( ̄▽ ̄)”