1. Struts2概念
struts:支柱、枝干,来源于建筑和旧式飞机使用的金属支架。
Struts在软件开发中,是一个非常优秀的框架。
Struts是流行和成熟的基于MVC设计模式的Web应用程序框架。
使用Struts的目的是减少我们在运用MVC设计模型来开发Web应用的时间。
2. MVC模式
2.1 Model1:代码可维护性差
JSP+JavaBean=Model1
2.2 Model2:最典型的MVC
JSP+Servlet+JavaBean=Model2
3. 第一个Struts2例子
3.1 Struts2历史
3.2 搭建Struts2环境
3.2.1下载相关jar包
下载地址:
Apache Struts官方网站 http://struts.apache.org/
Struts历史包 http://people.apache.org/builds/sturts/
3.2.2 目录分析:
apps参考war包(5个)
docs文档包,包含struts核心API,插件API和xwork的API
lib是驱动包,比较多,根据自己选择进行匹配
src是源码包,可以之间看到java文件源码
3.2.3 具体步骤
/**
* 第一个Struts2程序
* A:用eclipse实现
* 1.上Struts官网下载完整Struts包(导入lib下的9个包)
* 2.创建web项目,配置web.xml文件
* 3.配置struts.xml文件
* 4.创建action类,
* 5.在struts.xml中配置action
* 6.启动测试
*B:用MyEclipse实现
* 1.创建web项目->选中项目右键->myeclipse->add struts capabilities(不要太简单)
* 2.创建action类,并且启动测试
*/
/*
* Struts2工作原理
* web.xml写配置一个过滤器(struts),所以用户请求都会经过该过滤器,但struts只过滤自己相关的请求(.action),其他请求就会放行
* 过滤器名称:StrutsPrepareAndExecuteFilter
*/
public class HelloWorldAction extends ActionSupport {
@Override
public String execute() throws Exception {
System.out.println("执行Action");
//就是一个(视图)路径
return SUCCESS;
}
}
web.xml
<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>*.action</url-pattern>
</filter-mapping>
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts
Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="helloworld" class="com.imooc.action.HelloWorldAction">
<result>/result.jsp</result>
</action>
</package>
</struts>
4. Struts2的工作原理及文件结构
4.1 工作原理(面试问的很多喔)
4.2 核心文件
4.2.1 web.xml
4.2.2 struts.xml
4.2.3 struts.properties
4.3 文件讲解
5. 深入讲解Struts2的用法
5.1 访问Servlet API
在Servelt中doGet()方法和doPost()的参数中包含了request、response,这就是servlet API。
但是,struts2中的action的execute方法中并没有servlet API,所以struts2怎么去访问Servlet API呢?
有三种方法:
1. ActionContext
2. 实现…Aware接口
3. ServletActionContext
5.2 Action搜索顺序
一级一级往上找
5.3 动态方法调用
动态方法调用是为了一个action类仅仅对应一个方法。
所以当一个action类里面有多个方法时,怎么调用特定的方法呢?可以用动态方法调用。
1. 为一个action类对应的配置文件设置多个action,每个action设置method属性(与action里的方法对应),从而实现调用特定的方法
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="helloworld" class="com.imooc.action.HelloWorldAction">
<result>/result.jsp</result>
</action>
<action name="addAction" method="add" class="com.imooc.action.HelloWorldAction">
<result>/add.jsp</result>
</action>
<action name="updateAction" method="update" class="com.imooc.action.HelloWorldAction">
<result>/update.jsp</result>
</action>
</package>
</struts>
2 感叹号方式(不推荐使用)
3. 通配符方式(官方推荐)
花括号里的1解析第一个心号,2解析第二个心号
5.4 指定多个配置文件
使用include标签包含进去即可(防止主配置文件过于臃肿)
配置字符集
<constant name="strtus.i18n.encoding" values="utf-8"></constant>
5.5 默认Action
使用户体验更好
5.6 Struts2后缀
三个位置可以配置:struts.xml,struts.properties,web.xml
5.7 接收参数
5.7.1 使用action的属性接收参数
login.jsp(表单提交参数)
<body>
<!-- 使用action的属性接受参数值 -->
<form action="LoginAction.action" method="post">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="提交">
</form>
</body>
LoginAction.action接收并输出来自表单的参数
public class LoginAction extends ActionSupport{
private String username ;
private String password;
public String login() {
System.out.println(username);
System.out.println(password);
//...
return SUCCESS;
}
//属性的get和set方法
}
helloworld.xml配置action
<action name="LoginAction" method="login" class="com.imooc.action.LoginAction">
<result>/success.jsp</result>
</action>
新建success.jsp
<body>
<h1>This is success.jsp.</h1>
</body>
5.7.2 DomainModel方法(把属性封装在对象里)
新建User.java
public class User {
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(表单提交参数)
<body>
<!-- 使用action的属性接受参数值 -->
<form action="LoginAction.action" method="post">
用户名:<input type="text" name="user.username">
密码:<input type="password" name="user.password">
<input type="submit" value="提交">
</form>
</body>
LoginAction.action接收并输出来自表单的参数
public class LoginAction extends ActionSupport{
User user ;
public String login() {
System.out.println(user.getUsername());
System.out.println(user.getPassword());
//...
return SUCCESS;
}
pubilc void setUser(User user){
this.user=user;
}
public User getUser(){
return user;
}
}
5.7.3 使用ModelDriven方式接收参数(推荐使用)
login.jsp(表单提交参数),无需使用user.username了
<body>
<!-- 使用action的属性接受参数值 -->
<form action="LoginAction.action" method="post">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="提交">
</form>
</body>
LoginAction.action接收并输出来自表单的参数,无需user的get和set方法了,但user必须实例化;action类必须实现ModelDriven接口
public class LoginAction extends ActionSupport implement ModelDriven<User>{
User user = new User();
public String login() {
System.out.println(user.getUsername());
System.out.println(user.getPassword());
//...
return SUCCESS;
}
@Override
public User getModle(){
return user;
}
}
5.7.4 用传参数的方法给list赋值
login.jsp(表单提交参数),无需使用user.username了
<body>
<!-- 使用action的属性接受参数值 -->
<form action="LoginAction.action" method="post">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<!-- 书籍1和2怎么给list赋值呢? -->
书籍1:<input type="text" name="bookList[0]">
书籍2:<input type="text" name="bookList[1]">
<input type="submit" value="提交">
</form>
</body>
public class LoginAction extends ActionSupport implement ModelDriven<User>{
User user = new User();
public String login() {
System.out.println(user.getUsername());
System.out.println(user.getPassword());
//为集合赋值
System.out.println(user.getBookList.get(0));
System.out.println(user.getBookList.get(1));
//...
return SUCCESS;
}
@Override
public User getModle(){
return user;
}
}
5.7.5 当list集合里面放的是对象时
书籍1:<input type="text" name="bookList[0].username">
书籍2:<input type="text" name="bookList[1].username">
System.out.println(user.getBookList().get(0).getUsername());
System.out.println(user.getBookList().get(1).getUsername());
5.8 处理结果类型
5.8.1 input结果
5.8.2 局部结果与全局结果
5.8.3 type属性