1.
import org.apache.commons.beanutils.BeanUtils;
//将页面表单提交来的数据注入到action中的属性上。
BeanUtils.populate(action, req.getParameterMap());
处理表单提交过来的数据,但不可以处理时间类型的数据,要特殊处理
2.
import org.apache.commons.beanutils.ConvertUtils;
// 注册一个类型转换器
ConvertUtils.register(new DataTypeConvert(), java.util.Date.class);
处理时间数据
import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.apache.commons.beanutils.Converter;
public class DataTypeConvert implements Converter {
public Object convert(Class arg0, Object arg1) {
Object value = null;
if (arg0 == java.util.Date.class) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
value = sdf.parse((String) arg1);
} catch (ParseException e) {
e.printStackTrace();
}
}
return value;
}
}
3. 文件上传和处理文件的编码方式
//文件上传 表单所有的数据 又分为两块 一个普通数据 另一个数据为文件类型的数据
//如果为普通数据isFormField为TRUE则做普通数据处理 为FALSE则作为文件数据处理
//编码有三个地方 第一是页面里的charset=utf-8 第二是表单提交的enctype="multipart/form-data",application/x-www-form-urlencoded,text/plain
//第三是过滤器的编码方式request.setCharacterEncoding(encoding);
String contentType = req.getContentType();
if (contentType != null && contentType.startsWith("multipart/form-data")) {
// multipart/form-data文件方式提交数据
doFileUpload(req, action);
ServletFileUpload fileUpload = new ServletFileUpload(
new DiskFileItemFactory());
try {
List<FileItem> list = fileUpload.parseRequest(req);
for (FileItem item : list) {
try {
if (item.isFormField()) {
// 如果为普通的input表单元素,直接将值注入到Action中
String oldValue = item.getString();
String encoding = req.getCharacterEncoding();
if(encoding == null || encoding.equals("")){
encoding = "utf-8";
}
// 因为过滤器可能有设置,尽量使用过滤器的编码方式,如果没有,使用缺省的编码方式
String newValue = new String(oldValue
.getBytes("iso8859-1"), encoding);
BeanUtils.copyProperty(action, item.getFieldName(), newValue);
} else {
// 如果是文件类型的输入框,先判断是否有文件上传
if (item.getName() == null || item.getName().equals("")) {
continue;
}
// 如果有文件上传,把它保存到tomcat的临时目录中去。
String fileName = String.format("%s//%s.tmp",
System.getProperty("java.io.tmpdir"),
new Random().nextLong());
File file = new File(fileName);
item.write(file);
// 把临时目录的文件对象注入到action中,让action能对他灵活操作。
BeanUtils.copyProperty(action,
item.getFieldName(),
file);
// 将客户端的原始文件名也传递到action中
BeanUtils.copyProperty(action,
item.getFieldName() + "FileName",
item.getName());
}
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
} catch (Exception e) {
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
4. 过滤器 文件编码过滤器和录入过滤器
//配置编码过滤器
<filter>
<filter-name>SetCharacterEncoding</filter-name>
<filter-class>com.softeem.blog.filter.SetCharacterEncoding</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SetCharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
public class CharacterEncodingFilter implements Filter {
String encoding;
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest)arg0;
request.setCharacterEncoding(encoding);
arg2.doFilter(arg0, arg1); //放行
}
public void init(FilterConfig arg0) throws ServletException {
this.encoding=arg0.getInitParameter("encoding");
}
//配置录入过滤器
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.softeem.blog.filter.LoginFilter</filter-class>
<init-param>
<param-name>except</param-name>
<param-value>login.jsp,login.action,user_list.action</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
public class LoginFilter implements Filter {
String excepts;
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest)arg0;
HttpServletResponse response=(HttpServletResponse)arg1;
//--------URI=/blog/article_list.action
String uri=request.getRequestURI();
String cmd=uri.substring(uri.lastIndexOf("/")+1);
String[] ex=excepts.split(",");
for(String except:ex){
if(except.equalsIgnoreCase(cmd)){
arg2.doFilter(request, response);
return;
}
}
Object obj=request.getSession().getAttribute("USER");
if(obj==null){
response.sendRedirect("login.jsp");
return;
}
arg2.doFilter(request, response); //放行
}
public void init(FilterConfig filterConfig) throws ServletException {
excepts=filterConfig.getInitParameter("except");
}
}
5.
// 读配置文件struts.xml 在init()方法里读
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/struts.xml");
6.用dom4j解析struts.xml
// Map<String, ActionConfig> maps = new HashMap<String, ActionConfig>(); 用来保存解析好的strust.xml里的值 反射所需要的值
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
SAXReader reader = new SAXReader();
Document document = reader.read(in);
List<Element> actions = document.selectNodes("/struts/package/action");
for(Element element : actions){
String methodName = element.attributeValue("method");
if(StringUtils.isEmpty(methodName)){
methodName="execute";
}
ActionConfig aconfig = new ActionConfig(
element.attributeValue("class"),
methodName,
element.attributeValue("name"));
//// ActionConfig的属性是
////String className;
////String methodName;
////Map<String, ResultConfig> results = new HashMap<String, ResultConfig>();
////String uriName;
List<Element> results = element.selectNodes("result");
for(Element result : results){
String name = result.attributeValue("name");
if(StringUtils.isEmpty(name)){
name = "success";
}
ResultConfig rconfig = new ResultConfig(
name, result.attributeValue("type"), result.getText());
//// ResultConfig的属性是
//// String name;
//// String type;
//// String pageUri;
aconfig.getResults().put(name, rconfig);
}
maps.put(element.attributeValue("name"), aconfig);
}
7.我们的action.servlet
// 得到URI,根据URI实例化对应的Action
String cmd = getURI(req);
ActionConfig config = maps.get(cmd);
String clzName = config.getClassName();
String methodName = config.getMethodName();
// 实例化Action
Action action = getAction(clzName);
// 将页面传递过来的值装配到Action中
formAware(req, action);
// 将session传递到action中
doAware(req, resp, action);
// 在action上面调用它的方法
Object resultName = invokeAction(methodName, action);
ResultConfig rConfig = config.getResults().get(resultName);
// 把action里的所有属性放置到request中
saveActionProperties(req, action);
// 如果跳转页面不为空,根据跳转类型调用跳转方法
String address = rConfig.getPageUri();
if (StringUtils.isNotEmpty(address)) {
if ("forward".equals(rConfig.getType())) {
req.getRequestDispatcher(address).forward(req, resp);
} else {
resp.sendRedirect(address);
}
}
8.需要request的地方可以继承request的接口 session和response
/**
* 将HttpServletRequest, Httpsession, HttpServletResponse传递到action中 如果action
* 没有实现SessionAware, ResponseAware, RequestAware接口
* 就不将request,response,session注入
*
* @param req HttpServletRequest
* @param response HttpServletResponse
* @param action 需要注入3个变量的Action
*/
private void doAware(HttpServletRequest req, HttpServletResponse response,
Action action) {
/* 实现了SessionAware接口 */
if (action instanceof SessionAware) { // instanceof 判断a是否是b的实例
SessionAware sa = (SessionAware) action;
sa.setHttpSession(req.getSession());
}
/* 实现了ResponseAware接口 */
if (action instanceof ResponseAware) {
ResponseAware ra = (ResponseAware) action;
ra.setResponse(response);
}
/* 实现了RequestAware接口 */
if (action instanceof RequestAware) {
RequestAware ra = (RequestAware) action;
ra.setRequest(req);
}
}
9.适配器action接口;actionsupport实现action 以后所有要实现action的类就可以继承actionsupport; action的强制性被解除
public interface Action {
String execute();
}
public class ActionSupport implements Action {
public String execute() {
return null;
}
}