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

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

2016年06月22日 10:49:57

阅读数:2542

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

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于 Struts2 和 Hibernate 的登录和注册的完整实例。 首先,需要创建一个名为 `User` 的 JavaBean 类,用于表示用户信息: ```java public class User { private int id; private String username; private String password; // getters and setters } ``` 接下来,需要配置 Hibernate 的 `SessionFactory`,以便在操作数据库时使用。可以在 `hibernate.cfg.xml` 文件中进行配置: ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.url">jdbc:mysql://localhost:3306/test?useSSL=false</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property> <mapping class="com.example.User"/> </session-factory> </hibernate-configuration> ``` 接着,需要创建一个名为 `UserDao` 的类,用于操作数据库。在该类中,需要使用 Hibernate 的 API 进行增删改查操作: ```java public class UserDao { private SessionFactory sessionFactory; public UserDao() { Configuration configuration = new Configuration().configure(); sessionFactory = configuration.buildSessionFactory(); } public void addUser(User user) { Session session = sessionFactory.openSession(); Transaction tx = null; try { tx = session.beginTransaction(); session.save(user); tx.commit(); } catch (HibernateException e) { if (tx != null) { tx.rollback(); } e.printStackTrace(); } finally { session.close(); } } public User getUserByUsername(String username) { Session session = sessionFactory.openSession(); Transaction tx = null; User user = null; try { tx = session.beginTransaction(); Query query = session.createQuery("from User where username = :username"); query.setString("username", username); user = (User) query.uniqueResult(); tx.commit(); } catch (HibernateException e) { if (tx != null) { tx.rollback(); } e.printStackTrace(); } finally { session.close(); } return user; } } ``` 然后,需要创建一个名为 `UserAction` 的类,用于处理用户登录和注册的请求。在该类中,需要使用 Struts2 的 API 进行请求处理: ```java public class UserAction extends ActionSupport { private User user; private String confirmPassword; private UserDao userDao = new UserDao(); public String login() { User savedUser = userDao.getUserByUsername(user.getUsername()); if (savedUser == null || !savedUser.getPassword().equals(user.getPassword())) { addActionError("Invalid username or password!"); return INPUT; } return SUCCESS; } public String register() { if (!user.getPassword().equals(confirmPassword)) { addActionError("Passwords don't match!"); return INPUT; } User savedUser = userDao.getUserByUsername(user.getUsername()); if (savedUser != null) { addActionError("Username already exists!"); return INPUT; } userDao.addUser(user); return SUCCESS; } // getters and setters } ``` 最后,需要在 `struts.xml` 文件中进行配置,以便 Struts2 能够正确地处理请求: ```xml <?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.devMode" value="true"/> <package name="default" extends="struts-default"> <action name="login" class="com.example.UserAction" method="login"> <result name="success">/success.jsp</result> <result name="input">/login.jsp</result> </action> <action name="register" class="com.example.UserAction" method="register"> <result name="success">/success.jsp</result> <result name="input">/register.jsp</result> </action> </package> </struts> ``` 其中,`success.jsp` 是登录或注册成功后显示的页面,`login.jsp` 和 `register.jsp` 分别是登录和注册的页面。 这样,基于 Struts2 和 Hibernate 的登录和注册功能的完整实例就完成了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值