• Struts1.3——登录案例的改进


    在上篇写的用户登录验证案例的基础上进一步改进。

    1.在登录成功后的welcome.jsp页面显示登录成功的用户名

    思路1:在LoginAction中,将username放入request的域对象中

    因为,ActionMapping的findForward()方法实质上是请求转发,所以可以把username放入request的域对象中,如下:

    public class LoginAction extends Action {
        @Override
        public ActionForward execute(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response)
                throws Exception {
            UserForm userForm = (UserForm)form;
            System.out.println("用户名="+userForm.getUsername());
            System.out.println("密码="+userForm.getPassword());
            if("123".equals(userForm.getPassword())){
                // 把名字存入request域对象,因为findForward是转发,所以可以存到request对象中
                request.setAttribute("username", userForm.getUsername());
                return mapping.findForward("ok");
            }else{
                return mapping.findForward("error");
            }
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    然后,在welcome.jsp页面将request域对象中的username取出来即可,如下:

    <body>
        Welcome! <br>
        <%--把username取出来 --%>
        <%=request.getAttribute("username").toString() %>
        <br><a href="/strutslogin">返回重新登录</a>
    </body>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    但实际上,在struts中并不需要这么做,我们只需要在struts-config.xml文件中简单配置Action,就可以把UserForm这个表单的对象放入request或者session域对象中:

    思路2:直接在struts-config.xml中配置Action,添加scope元素,指定表单的生命周期

    <action path="/login" name="userForm" scope="request" type="com.gavin.actions.LoginAction">
        <forward name="ok" path="/WEB-INF/welcome.jsp"/>
        <forward name="error" path="/WEB-INF/error.jsp"/>
    </action>
    • 1
    • 2
    • 3
    • 4

    注意,如果不在action中配置scope属性,它也是默认存在的,并且默认取值为session。 
    在这里: 
    scope="request",相当于这样一句话:request.setAttribute("userForm",userForm) 
    scope="session",相当于:request.getSession().setAttribute("userForm",userForm)

    如果,我们在这里配置了scope属性,那么就相当于把userForm表单对象实例放入了request的域对象,这时候我们的welcome.jsp需要这么写:

    <body>
        Welcome! <br>
        <%--取出userForm对象,然后获取username --%>
        <%=((UserForm)request.getAttribute("userForm")).getUsername()%>
        <br><a href="/strutslogin">返回重新登录</a>
     </body>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.中文乱码问题处理

    在测试的过程中,发现如果用户名出现了中文,会产生中文乱码问题。

    在struts中,我们必须使用filter(过滤器)来解决struts中的中文乱码问题

    步骤如下:

    开发一个过滤器EncodingFilter,并设置它的request.setCharacterEncoding("utf-8")即可

    public class EncodingFilter extends HttpServlet implements Filter {
        @Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1,
                FilterChain arg2) throws IOException, ServletException {
            // 在这里设置接收编码
            arg0.setCharacterEncoding("utf-8");
            arg2.doFilter(arg0, arg1);
        }
        @Override
        public void init(FilterConfig arg0) throws ServletException {
    
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    然后在web.xml文件中配置该过滤器,使访问所有的页面都要经过该过滤器,如下:

    <filter>
            <filter-name>EncodingFilter</filter-name>
            <filter-class>com.gavin.filters.EncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.Action是单态的 
    单态的含义:单态是指在整个程序运行的过程中,始终是一个对象在运行、在为我们服务。 
    也就是说我们的LoginAction只被实例化一次,之后的所有访问都由这个对象来处理。

    4.关于struts-config.xml文件

    • 它的路径不一定非要放在WEB-INF目录下面,也可以自己随意放置,但一般上是放在WEB-INF目录下
    • 那么在一个项目中,能不能有多个struts-config.xml配置文件呢? 

    答案是可以的。 
    如果有两份配置文件,它仍然是由一个总控制器ActionServlet管理的,假设有struts-config.xml,struts-config2.xml两个配置文件,那么它们是这样配置的:

    <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,/WEB-INF/struts-config2.xml</param-value>
        </init-param>
    </servlet>
  • 相关阅读:
    [转]android Intent机制详解
    [转]Android进程与线程基本知识
    HTML背景图片自适应
    边框边界填充理解
    [转]Android 代码自动提示功能
    [转]Windows7:Visual Studio 2008试用版的评估期已经结束解决方法
    eclipse安装、汉化、搭建安卓开发环境
    asp.net控件拖不动。控件错误
    opengl 入门浅学(一)
    opengl 无法定位程序输入点_glutInitWithExit于动态链接库glut32.dll上
  • 原文地址:https://www.cnblogs.com/husam/p/7912151.html
Copyright © 2020-2023  润新知