表单处理:
获取表单数据:
在struts中,要想得到表单的数据,可以写个javabean,并且这个bean必须继承了ActionForm这个类,然后struts会自动将表单的数据封装到ActionForm的子类中,取得时候直接get就可以了
1.写ActionForm
2.修改Struts_config.xml文件,定义formbean,在action中引入formbean
引例:
环境配置:
web项目根目录:first_struts
/first_struts
/first_struts/JS
/first_struts/pages login.jsp success.jsp fail.jsp
/first_struts/pice
/first_struts/WEB-INF : web.xml struts_config.xml
/WEB-INF/classes
/WEB-INF/lib
/WEB-INF/src
/src/yuchen.form1.LoginAction.java
/src/yuchen.form1.LoginForm.java
程序目标:
测试struts应用,用户进入登陆页面,当提交数据的时候,显示登陆成功页面
得到表单数据,如果用户输入的是root,那么提示不能用这个名字登陆,否则,登陆成功
知识点:
1.struts应用中处理表单的方式:
需要将表单数据存放到一个javabean中,这个javabean的模型已经写好了,只要我们继承ActionForm类就
可以了,这个就可以从表单中读取参数了
2.语法
在struts_config.xml中定义formbean,然后在action中写上这个url中表单所对应的formbean
<form-bean
name="loginform"
type="yuchen.form1.LoginForm"/>//声明formbean
<action
name="loginform" //引入formbean
scope="request"
path="/login"
type="yuchen.form1.LoginAction">
<forward name="success" path="/pages/success.jsp"/>
<forward name="fail" path="/pages/fail.jsp"/>
</action>
jsp:
引用上面的login.jsp success.jsp
fail.jsp:
<h1>can no root login!</h1>
struts-config.xml:
<form-bean
name="loginform"
type="yuchen.form1.LoginForm"/>
<action
name="loginform" //引入formbean
scope="request"
path="/login"
type="yuchen.form1.LoginAction">
<forward name="success" path="/pages/success.jsp"/>
<forward name="fail" path="/pages/fail.jsp"/>
</action>
java:
引用上面的LoginAction.java
LoginForm.java:
package yuchen.form1;
import org.apache.struts.action.ActionForm;
public class LoginForm extends ActionForm{
private String user;
private String pwd;
public LoginForm(){};
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
}
表单验证:
1.ActionForm validate()
2.ActionErrors
3.ActionMessage
4.资源文件
5.引例
ActionForm validate():
要想做服务器端的表单验证,可以使用ActionForm的validate方法,在这个方法中定义验证逻辑
这个方法将返回ActionErrors类型的对象
ActionErrors:
这个类型的对象里面封装了若干的ActionMessage对象
ActionMessage:
这个里面有指向资源文件的key
资源文件:
classes/:MessageResources.properties
作用:这个资源文件里面有key指向的一些字符串,我们如果需要在页面上显示一些字符串信息,就可以使用
这个资源文件来实现,好处就是维护方便,可以国际化
在struts-config.xml中可以定义资源文件:
<message-resources>
ActionForm里面是ActionMessage,ActionMessage里面是key,key指向一个资源文件
引例:
环境配置:
web项目根目录:first_struts
/first_struts
/first_struts/JS
/first_struts/pages login.jsp success.jsp fail.jsp
/first_struts/pice
/first_struts/WEB-INF : web.xml struts_config.xml
/WEB-INF/classes MessageResources.properties
/WEB-INF/lib
/WEB-INF/src
/src/yuchen.form2.LoginAction.java
/src/yuchen.form2.LoginForm.java
程序目标:
测试struts应用,用户进入登陆页面,当提交数据的时候,显示登陆成功页面
得到表单数据,如果用户输入的是root,那么提示不能用这个名字登陆,否则,登陆成功
用户登陆,加入登陆验证,用户名和密码不能为空,如果为空,流转到login.jsp,如果是root显示登陆失败
知识点:
1.使用资源文件,并将资源文件中的values显示在jsp页面上,只有在产生错误的情况下才会显示
为资源文件加入新的key-value:修改MessageResources.properties
在struts-config.xml中加入标签
在ActionForm的vildate方法中new ActionErrors和ActionMessage(key)对象
显示资源文件中的values:在jsp页面中导入struts标签<%@taglib prefix="html" uri="/tags/struts-html" %> uri为web.xml中struts-html对应的url值 使用<html:errors>当发生错误的时候显示
2.加入表单验证功能
在struts-config.xml中加入<input>如果产生错误,导入指定的url,允许表单验证validate="true"
在ActionForm类中重写validate方法
jsp:
login.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@taglib prefix="html" uri="/tags/struts-html" %>
<!DOCTYPE html PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<html:errors/>
<form action="/first-struts/login.do" method="post">
userName: <input type="text" name="user" /><br>
password: <input type="text" name="pwd" /><br>
<input type="submit" />
</form>
</body>
</html>
引用上面的fail.jsp and success.jsp
修改struts-config.xml:
<action-mappings>
<action
input="/pages/login.jsp"
name="loginForm"
scope="request"
validate="true"
path="/login"
type="yuchen.form2.LoginAction">
<forward name="success" path="/pages/success.jsp"/>
<forward name="fail" path="/pages/fail.jsp"/>
</action>
资源文件:
error.user=User name can not be empty
error.pwd=Password can not be empty
引用LoginAction.java
修改LoginForm.java:
添加validate方法
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
// TODO Auto-generated method stub
ActionErrors errors=new ActionErrors();
ActionMessage am=null;
if(user==null||user.trim().length()==0){
am=new ActionMessage("error.user");
errors.add("user",am);
}
if(pwd==null||pwd.trim().length()==0||pwd.trim().length()<3){
am=new ActionMessage("error.pwd");
errors.add("pwd",am);
}
return errors;
}
国际化:
1.什么是国际化?有什么用?
2.开发步骤
3.引例
什么是国际化?有什么用?
界面友好化,比如说,中国区域的打开网站,显示中文,美国区打开网站显示的是英文
开发步骤:
1.写个文本文件,在里面写key-value
2.使用工具转化,并改副名
3.重启应用程序
引例:
引用上面的例子,上面的例子当提示错误信息的时候显示的是英文,我们做国际化,让他可以显示中文
1.写个文本文件,在里面写key-value
tome.txt:
error.user=用户名不能为空
error.pwd=密码不能为空
2.使用工具转化,并改副名 jdk1.5 bin中的native2ascii 要转化的文件 转到哪个文件
MessageResources_zh.properties:
error.user=/u7528/u6237/u540d/u4e0d/u80fd/u4e 3a /u 7a 7a
error.pwd=/u5bc6/u7801/u4e0d/u80fd/u4e 3a /u 7a 7a
struts exception:
1.什么是struts exception:有什么用?
2.内容
3.引例
什么是struts error?有什么用?
struts异常是处理action发生的异常,使用的是资源文件输出异常信息
内容:
action两种情况产生的异常:
1.action还没有将数据传递到m层的时候就产生的异常
2.收到m层的结果后产生了异常,例如:数据库连接不正常,返回的结果不对等等
处理流程:
1.捕获异常
2.抛出异常,requestproessor接到这个异常
3.转给默认的异常处理器(也可以自己定义一个异常处理的类)
4.将处理的信息显示在一个jsp页面上
引例:
程序目标:
当用户输入root的时候,我们在action中抛出一个异常,将异常信息显示出来
程序逻辑:
1.action做校验
2.如果user为root,产生一个异常
3.抛出异常
4.Struts-config.xml中配置异常的声明
5.jsp显示异常信息
知识点:
login.jsp:
如果发生异常,显示异常信息,这个信息是在资源文件中定义的
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="html" uri="/tags/struts-html" %>
<!DOCTYPE html PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<html:errors />
<form action="/yuchen-struts/login.do" method="post">
userName: <input type="text" name="user"/><br>
password: <input type="password" name="pwd" />
<input type="submit" />
</form>
</body>
</html>
success.jsp:
<h1>success!</h1>
LoginAction.java:
package yuchen.exception;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class LoginAction extends Action{
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest
request, HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
LoginForm lf=(LoginForm)form;
if("root".equals(lf.getUser())){
throw new LoginException("erro");
}
return mapping.findForward("success");
}
}
LoginForm.java:
package yuchen.exception;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
public class LoginForm extends ActionForm{
private String user;
private String pwd;
public LoginForm() {
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
}
LoginException.java:
package yuchen.exception;
public class LoginException extends Exception {
public LoginException(String message){
super(message);
}
}
struts-config.xml:
//声明ActionForm
<form-beans>
<form-bean
name="loginForm"
type="yuchen.exception.LoginForm"/>
//声明action and exception
<action
name="loginForm"
scope="request"
path="/login"
type="yuchen.exception.LoginAction">
<exception
key="error.root"
type="yuchen.exception.LoginException"
path="/pages/login.jsp"/>
<forward name="success" path="/pages/success.jsp"/>
</action>
资源文件:error.root=You can not be a root!
动态form:
1.什么是动态form?有什么用?
2.语法
3.引例
什么是动态form?有什么用?
懒汉form,不用写ActionForm类了,直接在配置文件中声明,这样的好处在于如果表单的数量变更就不用再修改ActionForm类了,struts会根据配置文件自动生成代码,但是没有表单验证的功能了
语法:
修改struts-config.xml:
<form-bean
name="dyLoginForm"
type="org.apache.struts.action.DynaActionForm">
<form-property name="user" type="java.lang.String" />
<form-property name="pwd" type="java.lang.String" />
</form-bean>
DynaActionForm这个类是动态form类,声明表单的属性
在action类这样写:
DynaActionForm df=(DynaActionForm)arg1;
df.get("参数");
引例:
程序目标:
判断用户名和密码,如果是yuchen,123显示成功页面,否则显示失败
程序逻辑:
1.login.jsp,success.jsp,fail.jsp
2.LoginAction.java
3.struts-config.xml 写form
login.jsp success.jsp fail.jsp略
LoginAction.java:
package yuchen.dyloginform;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
public class LoginAction extends Action{
@Override
public ActionForward execute(ActionMapping arg0, ActionForm arg1, HttpServletRequest
arg2, HttpServletResponse arg3) throws Exception {
// TODO Auto-generated method stub
DynaActionForm df=(DynaActionForm)arg1;
String nextUrl;
if(("yuchen".equals(df.get("user"))&&"123".equals(df.get("pwd")))||
("admin".equals(df.get("user"))&&"admin".equals(df.get("pwd")))){
nextUrl="success";
}else{
nextUrl="fail";
}
return arg0.findForward(nextUrl);
}
}
配置文件:
<form-bean
name="dyLoginForm"
type="org.apache.struts.action.DynaActionForm">
<form-property name="user" type="java.lang.String" />
<form-property name="pwd" type="java.lang.String" />
</form-bean>
<action-mappings>
<action
name="dyLoginForm"
scope="request"
path="/login"
type="yuchen.dyloginform.LoginAction">
<forward name="success" path="/pages/success.jsp"/>
<forward name="fail" path="/pages/fail.jsp"/>
</action>