struts2
基于MVC的java web框架。与Servlet类似。
模型对应javabeans,表示业务和数据库代码;
视图表示页面设计的jsp文件;
控制器由过滤器、拦截器和Action组件构成。
与Servlet区别
servlet是映射型,一个jsp页面映射一个Servlet类。
struts2是过滤(拦截)型。为事件处理类设置要处理的类型如/*,.action
使用步骤:如登陆
- 写一个jsp前端界面login.jsp,这里要用到form,用系统中的struts标签:<%@taglib prefix='s' url="/struts-tags"%>
- 在web.xml中配置<filter>,<filter-class>指定处理动作类;配置<filtet-mapping>,在它的子元素<url-pattern>中填/*,表示将struts2过滤器应用到所有请求url上.
- 配置struts.xml文件.配置<action>与<result>,action元素属性有name,class与method,默认method为execute().result为action的子元素,指定动作结束后到哪个页面。
- 添加事件处理类如Login.java,继承ActionSupport类
- 注意:表的属性名要和处理类中变量名同名!这点和servlet不同
应用实例(一):Struts2开发一个登陆系统。(不用数据库)
(1)写一个logon.jsp。(根据需要,一般还要写success.jsp与error.jsp供登录后跳转) 其中使用struts标签<%@ taglib prefix="s" uri="/struts-tags" %> <s:form action="Login">等,访问格式:http://localhost:8080/Struts12/login.jsp
<%@ page contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head><title>登录页面</title></head>
<body>
<p>请输入用户名和密码:</p>
<s:form action="Login">
<s:textfield name="userName" label="用户名"
tooltip="输入用户名" labelposition="left" />
<s:password name="passWord" label="密码"
tooltip="输入密码" labelposition="left" />
<s:submit value="登录" align="center" />
</s:form>
</body>
</html>
(2)创建Action动作类,这里命名为HelloAction,继承ActionSupport类 ,类中定义的成员变量要与form表单中元素name相同,才能映射成功!注意类HelloAction要符合javabeans规范,每个成员变量要有getter,setter方法。
package com;
import com.opensymphony.xwork2.ActionSupport;
public class HelloAction extends ActionSupport {
private String userName;
private String passWord;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
@Override,默认执行execute()方法,可以在struts.xml中指定
public String execute() throws Exception {
if (userName.equals("lang") && passWord.equals("lang")) {
return "success";
} else {
return "error";
}
}
}
(3)配置web.xml文件,配置<filter>与<filter-mapping>元素,设置过滤页面类型。
可以右键项目->myeclipse->add stuts capabilities自动配置,结果:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping></web-app>
(4)配置struts.xml,设定每个动作的处理类及函数与执行完成后的跳转函数。
这里只有一个动作,就是Login,当点击登录按钮时,工作传到com.HelloAction的execute()函数处理,执行完成后,如果返回success,则跳转到success.jsp,返回error则跳转到error.jsp.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.devMode" value="false" />
<package name="basicstruts2" extends="struts-default">
<action name="Login" class="com.HelloAction"
method="execute">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
应用实例(二):整合Hibernate和Struts2开发一个注册、登陆系统。
实例 (一)中对用户名和密码的验证直接写在execute()函数里很不安全,且包含组合少。对于登录操作,应该与数据库结合起来,并增加注册操作,将数据插入数据库。所以这里结合Hibernate框架。
整个项目:
重要函数:
保存到数据库:
org.hibernate.Session session=HibernateSessionFactory.getSession();
Transaction tx=session.beginTransaction();
session.save(email);
tx.commit();
执行sql语句查询获得数据:
org.hibernate.Session session=HibernateSessionFactory.getSession();
Transaction tx=session.beginTransaction();
Query query=session.createQuery("from Emailtab where email="+email.getEmail());
List list=query.list();
tx.commit();
if(list.size()==1){
return SUCCESS;
}
(1)在数据库中建表emailtab,表中包含email与password两个属性,email为主键。
(2)用Hibernate建立与数据库的联系:构建可持久化类Emailtab.java,生成session工厂:HibernateSessionFactory.java。配置映射文件Emailtab.hbm.xml与配置文件hibernate.cfg.xml,这些通过右键项目->myeclipse->add stuts capabilities可自动完成。
(3)数据库连接完成,接下来就是和(一)一样编写jsp页面:
注册register.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'register.jsp' starting page</title>
</head>
<body>
<p>注册一个新用户</p>
<s:form action="Register">
<s:actionerror/><s:fielderror/>
<s:textfield name="email.email" label="邮箱名"/>
<s:password name="email.password" label="口令"/>
<s:submit value="注册"/>
</s:form>
</body>
</html>
login.jsp<body>部分:
<body>
<p>请输入邮箱名和密码:</p>
<s:form action="Login">
<s:actionerror/><s:fielderror/>
<s:textfield name="email.email" label= "邮箱名" tooltip="输入邮箱名" labelposition="left"/>
<s:password name="email.password" label="密码" tooltip="输入密码" labelposition="left"/>
<s:submit value="登陆" align="Center"/>
</s:form>
</body>
(4)动作类:RegisterAction:
这时它的成员变量为Emailtab类对象,两个方法register()与login()分别处理注册于登录动作。
package com;
import java.util.List;
import javax.jms.Session;
import org.hibernate.Query;
import org.hibernate.Transaction;
import com.opensymphony.xwork2.ActionSupport;
public class RegisterAction extends ActionSupport {
private Emailtab email;
public Emailtab getEmail() {
return email;
}
public void setEmail(Emailtab email) {
this.email = email;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
public String register() throws Exception {
try {
org.hibernate.Session session=HibernateSessionFactory.getSession();
Transaction tx=session.beginTransaction();
session.save(email);
tx.commit();
return SUCCESS;
} catch (Exception e) {
e.printStackTrace();
HibernateSessionFactory.closeSession();
return ERROR;
}
}
public String login() throws Exception {
try {
org.hibernate.Session session=HibernateSessionFactory.getSession();
Transaction tx=session.beginTransaction();
Query query=session.createQuery("from Emailtab where email="+email.getEmail());
List list=query.list();
tx.commit();
System.out.println(list.size());
if(list.size()==1)
{
System.out.print("111\n");
return SUCCESS;
}
return ERROR;
} catch (Exception e) {
e.printStackTrace();
HibernateSessionFactory.closeSession();
return ERROR;
}
}
}
(5)web.xml:同(一)
(6)struts.xml:
4个动作。进入注册界面、注册、进入登录界面、登录。输入registerInput进入注册界面;输入loginInput进入登录界面。当然也可以直接输入register.jsp等进入
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.devMode" value="false" />
<package name="basicstruts2" extends="struts-default">
<action name="registerInput">
<result>/register.jsp</result>
</action>
<action name="loginInput">
<result>/login.jsp</result>
</action>
<action name="Register" class="com.RegisterAction" method="register">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="Login" class="com.RegisterAction" method="login">
<result name="success">/welcome.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>