一、配置
如图所示,开发前先配好工作环境。
1. 将Structs压缩包(自行下载后)解压缩,将目录 struts-2.3.20\apps\struts2-blank\WEB-INF\lib 下的jar包全部导入到项目的WEB-INF的lib目录下。
2 WEB-INF下建立web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" 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">
<display-name>Struts Blank</display-name>
<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>
</web-app>
3 src下建立struts.xml,并做相应的配置(配置package、action、处理结果result)
<?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>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.i18n.encoding" value="UTF-8" />
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<package name="default" extends="struts-default">
<action name="*" class="com.csp.servlet.LoginAction" method="login">
<!-- <result type="json"></result> -->
<result >/WEB-INF/{1}.jsp</result>
</action>
</package>
</struts>
4.在src下写各种Action的处理类
举例如下
package com.csp.servlet;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import com.opensymphony.xwork2.ActionSupport;
/**
* Servlet implementation class LoginAction
*/
public class LoginAction extends ActionSupport implements ServletRequestAware,ServletResponseAware {
/**
*
*/
private static final long serialVersionUID = 1L;
HttpServletRequest request;
HttpServletResponse response;
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 void setServletResponse(HttpServletResponse arg0) {
// TODO Auto-generated method stub
this.response=arg0;
}
@Override
public void setServletRequest(HttpServletRequest arg0) {
// TODO Auto-generated method stub
this.request=arg0;
}
public void login(){
response.setContentType("text/json;charset=utf-8");
response.setCharacterEncoding("UTF-8");
Map<String,String> json=new HashMap<String,String>();
if("admin".equals(username)&&"123456".equals(password)){
json.put("message","欢迎管理员登陆");
}else if(!"admin".equals(getUsername())&&"123456".equals(getPassword())){
json.put("message","欢迎"+getUsername()+"登陆!");
}else{
json.put("message","非法登陆信息");
}
try {
byte[] jsonBytes=json.toString().getBytes("utf-8");
response.setContentLength(jsonBytes.length);
response.getOutputStream().write(jsonBytes);
response.getOutputStream().flush();
response.getOutputStream().close();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
参考:
http://blog.csdn.net/killmice/article/details/9114331
二、原理
1. web.xml 在学习SSH之前,主要是用来配置Servlet。学习了Struts框架后,Servlet的概念被Action替代,尽管底层仍然是Servlet。web.xml主要是针对tomcat服务器而言,主要配置核心控制器,各种过滤器,项目运行的时候首先运行该配置文件。
2. struts.xml 主要是Struts框架的配置文件,用来配置Action。相当于以前的Servlet。客户端发来的请求进行预处理,然后可以查询struts.xml文件得到相应的处理类和处理方法,配置action的时候,method不写,默认是execute方法。配置处理结果,说白了就是将逻辑结果映射到物理页面。
3. 是什么让http请求和action关联在一起的?
返回上面看web.xml的内容,web.xml对任何请求进行过滤,通过反射,调用org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter,类的方法,方法的调用顺序如下:
init—>doFilter—>destroy
init()中Dispatcher被初始化,加载struts2的相关配置文件,将按照顺序逐一加载:default.properties,struts-default.xml,struts-plugin.xml,struts.xml,……
参考:
http://www.iteye.com/topic/829843
这个时候,struts.xml就粉墨登场,struts.xml也就和web.xml联系起来了。不难想到,框架中大量用到了反射技术,比如在struts.xml文件中找到了处理类,然后根据这个类名,创建对象,反射的方式调用处理方法。另一方面,也调用了get和set方法,自动的完成请求参数的传递,不用像以前那样getHttpRequest().getParameter()。使用更加方便了。