公司开发时使用了Struts2的一些新特性——convention-plugin代替codebehind-plugin来实现struts的零配置。Convention插件更彻底,该插件完全抛弃配置信息,不仅不需要是使用struts.xml文件进行配置,甚至不需要使用Annotation进行配置,而是由struts2根据约定自动配置。下面先看一下使用配置文件与零配置的区别:
Struts2提供了按照约定和Java注解来替代struts.xml实现零配置的功能,但实际应用往往会两者结合使用。
注:零配置不是没有配置,而是配置少
一、使用配置文件
1、需要的jar包
Struts版本不同,包名略有不同
2、具体代码
a.配置文件
Web.xml:
<span style="font-family:SimSun;font-size:18px;"> <?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!-- 指明过滤器如何拦截URL -->
<filter-mapping>
<filter-name>struts2</filter-name>
<!--拦截所有的HTTP请求-->
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--访问初识页-->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app></span>
Struts.xml:
集中了所有页面的导航定义。
<span style="font-family:SimSun;font-size:18px;"> <struts>
<?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>
<!-- 需要继承struts-default包,这样就拥有的最基本的功能 -->
<package name="struts2" extends="struts-default">
<action name="login" class="com.bjpowernode.struts2.LoginAction">
<result name="success">/login_success.jsp</result>
<result name="error">/login_error.jsp</result>
</action>
</package>
</struts>
</span>
由于在web项目部署到服务器上,开启服务器对web项目进行编译时会自动把src文件夹下的文件加载到服务器class文件夹下,所以我们直接在src下面建立struts.xml文件,
1.<package>主要是作为分包作用,比如一个项目分好几个模块,这里可以每一个模块分配一个包,一个struts.xml文件中可以出现多个<package>标签,这里一定要有extends="struts-default",因为struts的核心拦截器都配置在struts-default包中,如果没有这个,所有请求都不会请求到
2.一个<action>标签对应一个action类,主要是通过action标签中的去寻找class,然后执行对应的class。Action标签里有一个一个method属性,他可以指定执行action中的哪个方法
3、为什么提交的请求能到struts.xml找到对应的action?因为struts2的核心是拦截器,一切请求都要经过拦截器才转发给所对应的action的。Struts2中第一个拦截请求的就是org.apache.struts2.dispatcher.FilterDispatcher这个拦截器
b.action
解決了如何把JSP頁面上的数据根据实际开发项目中具体的业务逻辑来进行处理的问题。
<span style="font-family:SimSun;font-size:18px;">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;
}
//加载Action实例时被调用
public String execute() throws Exception {
if ("admin".equals(username) && "admin".equals(password)) {
return "success";
} else {
return "error";
}
}
}
</span>
Struts2中返回的也是一个普通字符串,此字符串内容就是之前所述的导航页面的唯一标识。c.jsp
<span style="font-family:SimSun;font-size:18px;">登录:
<body>
<form action="login.action">
用户名:<input type="text" name="username"><br>
密 码:<input type="text" name="password"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
成功:
<body>
${username },登录成功
</body>
</html>
失败:
</head>
<body>
登录失败
</body>
</html>
</span>
URL:
二、零配置—Zero Config
1、需要使用Convention插件
将struts2-convention-plugin-2.2.1.jar文件复制到应用的WEB-INF/lib目录下
2、具体代码
a.配置文件
Web.xml:同上
Struts.xml:
<span style="font-family:SimSun;font-size:18px;"> <?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>
</struts>
</span>
b.action
<span style="font-family:SimSun;font-size:18px;"> loginAction:
public class LoginAction extends ActionSupport{
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{
if("admin".equals(username) && "admin".equals(password)){
return "success";
}else{
return "error";
}
}
/**
* 用户界面
* @return start字符串
*/
public String start(){
return "start";
}
}
</span>
c.jsp
目录结构:
<span style="font-family:SimSun;font-size:18px;">login-start:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
<form action="login.action">
用户名:<input type="text" name="username"><br>
密 码:<input type="text" name="password"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
</span>
URL:
下篇博客会详细介绍Struts2零配置是如何实现的。