• 学习笔记归纳 201095.19


    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;

    }

    }

  • 相关阅读:
    【翻译】Ext JS最新技巧——2014-9-10
    Ext JS 5的声明式事件监听
    SpringBoot启动方式讲解和部署war项目到tomcat9
    异常处理
    SpringBoot2.x个性化启动banner设置和debug日志
    实用博客
    SpringBootTest单元测试实战、SpringBoot测试进阶高级篇之MockMvc讲解
    SpringBoot注解把配置文件自动映射到属性和实体类实战
    SpringBoot2.x配置文件讲解
    SpringBoot2.x使用Dev-tool热部署
  • 原文地址:https://www.cnblogs.com/loveqin24/p/1997127.html
Copyright © 2020-2023  润新知