Struts基本介绍及用法

什么是struts

struts是一筐经典的MVC框架

struts的请求流程

1.用户发送一个request,被ActionServlet拦截
2.ActionServlet根据struts-config.xml中的配置内容,将请求的参数传到对应的Formbean中,并设置session
3.根据请求中的action参数,再struts-config.xml中找到对应的Action(Controller)
4.根据Action的处理结果,会返回一个forward变量,此时通过mapping.findForward()查找出struts-config.xml对应的forward所标示的Action或者JSP页面,将请求转到下一个处理.如果是forward指向JSP页面,则输出到前台

怎么使用

1.在web.xml中配置ActionServlet

<servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>3</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>3</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

2.配置struts-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- DTD是提示需要的配置信息 -->
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>
  <!-- 配置表单 -->
  <form-beans>
  <!-- name是表单的名字,可以随意写,但是建议取名表单类名小写 -->
  <!-- type用于指定表单类的全路径 -->
  <form-bean name="userForm" type="com.crc.forms.UserForms"/>
  </form-beans>
  <global-exceptions />
  <global-forwards />
  <!-- 配置action -->
  <action-mappings>
  <!-- 配置具体的一个action path:表示将来访问该action的资源名 -->
  <!-- name用于关联某个表单 -->
  <!-- type用于指定该action类的全路径 -->
  <!-- scope="request"表示该action对应的表单对象的访问范围-生命周期是request级别的 -->
  <action path="/login" name="userForm" type="com.crc.actions.LoginAction">
  <!-- 这里配置跳转关系 -->
  <!-- name表示结果名称  path表示转发到哪个页面去 -->
  <forward name="ok" path="/WEB-INF/ok.jsp"/>
  <forward name="err" path="/WEB-INF/err.jsp"/>
  </action>
  </action-mappings>
  <message-resources parameter="com.crc.struts.ApplicationResources" />
</struts-config>

3.下面用一个登陆流程示例
先配置jsp

<body>
    <form action="/strutstools/login.do" method="post">
    u:<input type="text" name="username"><br/>
    p:<input type="password" name="password"><br/>
    <input type="submit" value="login">
    </form>
  </body>

这里login.do会通过struts-config.xml找到要执行哪一个Action,如果提交数据存在表单,则通过struts-config.xml的

<action path="/login" name="userForm" type="com.crc.actions.LoginAction">

里面name=”userForm”找到struts-config.xml对应的form-bean name=”userForm”

<!-- 配置表单 -->
  <form-beans>
  <!-- name是表单的名字,可以随意写,但是建议取名表单类名小写 -->
  <!-- type用于指定表单类的全路径 -->
  <form-bean name="userForm" type="com.crc.forms.UserForms"/>
  </form-beans>

通过Action里面的逻辑操作

public class LoginAction extends Action {

    //我们需要重新编写一个方法:execute会被自动调用有点类似servlet的service/doget方法
    //ActionMapping
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        // TODO Auto-generated method stub
        //return super.execute(mapping, form, request, response);
        //取出表单数据
        //AciontForm,把from转成对应的UserForm对象
        UserForms userForm=(UserForms)form;
        Session session=MySessionFactory.getSessionFactory().openSession();
        Transaction ts=null;
        try {
            ts=session.beginTransaction();
            List list = session.createQuery("select id ,email from Employe").list();
            for (int i = 0; i < list.size(); i++) {
                System.out.println("111=");
                Object [] objs = (Object[]) list.get(i);
                System.out.println("222="+list.toString());
                System.out.println("222="+objs[0].toString());
                System.out.println("222="+objs[1].toString());
            }
            ts.commit();
        } catch (Exception e) {
            // TODO: handle exception
            if (ts!=null) {
                System.out.println("1111");
                ts.rollback();
            }
            throw new RuntimeException(e.getMessage());
        }finally{
            session.close();
        }

        if (userForm.getPassword().equals("123")) {
            request.setAttribute("username", userForm.getUsername());
            return mapping.findForward("ok");
        }else{
            return mapping.findForward("err");
        }
    }
}

mapping.findForward(“ok”);返回的ok,在struts-config.xml找到对应的界面

<forward name="ok" path="/WEB-INF/ok.jsp"/>

在这个路径下找到jsp界面,返回给用户
4.处理页面乱码问题
先在web.xml配置一个自定义filter

<filter>
  <filter-name>MyFilter1</filter-name>
  <filter-class>com.crc.filters.MyFilter1</filter-class>
  </filter>
  <filter-mapping>
  <filter-name>MyFilter1</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>

再写一个filter类

@WebFilter("/MyFilter1")
public class MyFilter1 implements Filter {
    /**
     * Default constructor. 
     */
    public MyFilter1() {
        // TODO Auto-generated constructor stub
    }
    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }
    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        // place your code here
        // pass the request along the filter chain
        //chain.doFilter(request, response);
        //这里设置接收编码
        request.setCharacterEncoding("utf-8");
        //response.setCharacterEncoding("utf-8");
        chain.doFilter(request, response);
        response.setContentType("text/html;charset=utf-8");
    }
    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }
}

通过注解方式配置,拦截所有的请求,处理页面乱码

猜你喜欢

转载自blog.csdn.net/qq_29485643/article/details/81608174