一.环境搭建
1.导包
到要导入的9个包
commons-fileupload-1.2.2
commons-io-2.0.1
commons-lang-2.5
commons-logging-1.1.1
freemarker-2.3.18
javassist-3.11.0GA
ognl-3.0.4
struts2-core-2.3.1.2
xwork-core-2.3.1.2
2.web.xml
在其中添加过滤器,接收任何的网站,执行org.apache....类
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.struts.xml
在src下面新建struts.xml,并将<!.....>这其中的代码粘贴进去,在<struts>之间进行配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
</struts>
二.完成第一个struts2的例子
1.新建jsp文件:result.jsp
2.写一个继承ActionSupport的类:HelloWorldAction.java
public class HelloWorldAction extends ActionSupport{
@Override
public String execute() throws Exception {
System.out.println("执行Action");
return SUCCESS;
}
}
3.在struts.xml中添加action行为
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="helloworld" class="com.imooc.action.HelloWorldAction">
<result>/result.jsp</result>
</action>
</package>
</struts>
指定了action的行为类是HelloWorldAction,然后调用其中默认的方法(execute),最后跳转到根目录下的result.jsp
注意这个action的name属性,默认的情况下调用的网址是:.../项目名/helloworld.action
4.原理
先来看张图
其过程是:客户请求,在web.xml中的过滤器进行过滤,当ActionMapper检测到网址的后缀名是以.action结尾的话,就交个StrusPrepareAndExecuteFilter(和之前web.xml中的filter的class是一样的),然后会通过Manager与struts.xml关联,在通过一些拦截器后执行action,并返回到Template,最后在通过拦截器,回复到客户端
三.struts的基本用法简介(讲接收参数,结果处理)
1.接收参数的三种方法
<1>action属性
<form action="helloworld.action" method="post">
用户名:<input name="username" type="text">
密码:<input name="password" type="text">
<input type="submit" value="提交" >
在和helloworld.action关联的方法中
public class HelloWorldAction extends ActionSupport{
/*
* 第一种获取表单值的方法是使用和表单中相同的属性名,
* 一定要记得添加set,get方法,表单会自动通过这些方法将对应的值添加进去
*/
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;
}
@Override
public String execute() throws Exception {
System.out.println(username);
return SUCCESS;
}
}
<2>使用DomainModel
传入一个对象,类User按照JavaBean写法,然后是在jsp的表单中属性名前面加上对象名
下面调用的是loginAction()方法,这个需要在struts的action里添加method属性为"loginAction"
public class HelloWorldAction extends ActionSupport{
/*
* 第二种接收参数的方法是使用对象,同样要使用set,get方法
* 要实现表单中的属性名和该对象中的属性匹配,需要在表单中添加对象名,来确定往哪个对象中传值
*/
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
System.out.println("执行Action");
return SUCCESS;
}
public String loginAction(){
System.out.println(user.getUsername());
return SUCCESS;
}
}
<3>实现ModelDriven接口
与第二种方法不同的是不用再jsp页面使用对象名来命名了,直接使用和User匹配的属性,即第一种中使用的
public class HelloWorldAction extends ActionSupport implements ModelDriven<User>{
/*
* 第三种方法是实现ModelDriven接口
*/
User user=new User();
@Override
public String execute() throws Exception {
System.out.println("执行Action");
return SUCCESS;
}
public String loginAction(){
System.out.println(user.getUsername());
return SUCCESS;
}
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
}
2.关于input
限制输入的条件
HelloWorldAction类
public class HelloWorldAction extends ActionSupport implements ModelDriven<User>{
User user=new User();
@Override
public String execute() throws Exception {
System.out.println("执行Action");
return SUCCESS;
}
public String loginAction(){
System.out.println(user.getUsername());
return SUCCESS;
}
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
@Override
public void validate() {
// TODO Auto-generated method stub
if(user.getAge()==0){
//如果年龄为空,就会调用下面这句,返回到struts中的result="input"的jsp页面
this.addFieldError("age", "年龄不能为空");
//if语句写在其他函数中要想自动返回还要加return INPUT;
}
}
}
上面的if条件是可以写到loginAction中的,只是要多加一条return的语句,因为下面struts.xml中action对应的方法就是loginAction,当然ActionSupport类给我们提供了更新的方法,会自动调用
struts.xml
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="helloworld" method="loginAction" class="com.imooc.action.HelloWorldAction">
<result>/result.jsp</result>
<result name="input">/login.jsp</result>
</action>
</package>
</struts>
在jsp页面中添加s标签
声明
<%@ taglib prefix="s" uri="/struts-tags" %>
在年龄input的后面添加如下语句
<s:fielderror name="age"></s:fielderror>
然后当login.jsp页面中提交后,如果age等于空,就会显示年龄不能为空