Struts练习
1.主要内容:
1.在项目中如何用struts
2.重写RequestProcessor类的processPreprocess(rq,res)方法
3.如何实现插件PlugIn
4.读属性文件//在MyPlugIn里用到
5.错误信息
6.RequestProcessor类和plugIn 示例项目struts02
错误信息 示例项目struts_error
2.详细实现(RequestProcessor类和plugIn示例在struts02下)
导入struts资源,并自动生成一些东西
1.导入struts资源,并自动生成一些东西
1.新建项目struts02-->右键struts02(选MyEclipse-->Add Struts Capabilities)
弹出窗口的Base package for ..后的文本框清空-->finish
2.struts02->WebRoot->WEB-INF->struts-config.xml(双击打开)-->右键空白处(选New 再选
Form Action Jsp),在Use case里写login->单击下面的add->name后输入username点add,
再输入password点add 再点close
3.然后,选择jsp选项卡->Create Jsp form前勾选上(路径最好改下/login.jsp)->点next
找到forward选项卡 点add,然后name后文本框写:success path后:/success.jsp ->点add
再次name后文本框写:failure path后:/failure.jsp ->点add 后点close 点finish
4. 注意: path后面一定要写成 形如:"/success.jsp" 即:有/和.jsp 很容易遗漏的,特此提醒
还有,finish后,要新建2个jsp页面success.jsp 和failure.jsp
2. struts实现登录
1.在src加入service包(里面加入1个类(LoginService),实现登录验证)
LoginForm类
LoginForm类
import form.LoginForm;
public boolean verify(LoginForm loginForm) {
if("123".equals(loginForm.getUsername())&&"123".equals(loginForm.getPassword()))
return true;
return false;
}
2.在action包下LoginAction内
LoginAction内的方法
LoginAction内的方法
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
LoginService loginService = new LoginService();
boolean result = loginService.verify(loginForm);
if(result){
return mapping.findForward("success");
}
else
return mapping.findForward("failure");
}
3.以上就完成了,现在部署,并在页面上输入路径访问 http://localhost:9090/struts02/login.jsp
3. 加MyRequestProcessor类(在action包下加,并继承RequestProcessor类)
1.在此类中重写processPreprocess(rq,res)方法
重写processPreprocess方法
重写processPreprocess方法
public MyRequestProcessor(){}
public boolean processPreprocess(HttpServletRequest request,HttpServletResponse response)
{
//flag为true,就会继续执行下一步ActionForm
// 为false表示不继续执行,不要忘了跳转
boolean flag=false;
//如果用户名输入的是123,那么就跳到错误页面
if("123".equals(request.getParameter("username")))
{
try {
response.sendRedirect("error.jsp");
} catch (Exception e) {
e.printStackTrace();
}
}
else
flag= true;
return flag;
}
提醒:processPreprocess不要写错了,虽然我十分小心,第一次的时候,还是写错了(写成processPreprocessor了)
2.在struts-config里 <controller processorClass="action.MyRequestProcessor"></controller>
4.PlugIn的练习
1.新建一类MyPlugIn(在action包下,实现PlugIn接口) 写一个属性,和在init方法里,把data放入application
MyPlugIn类
MyPlugIn类
private String data;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public void init(ActionServlet arg0, ModuleConfig arg1)
throws ServletException {
arg0.getServletContext().setAttribute("data", data);
}
2.在struts-config.xml里新加plug-in节点(注意顺序,一定要是在message-resources节点后)
plug-in节点
plug-in节点
<message-resources parameter="ApplicationResources" />
<plug-in className="action.MyPlugIn">
<set-property property="data" value="abc"/>
</plug-in>
3.然后,在页面里就可以得到值:${applicationScope.data}
4.值保存到属性文件
1.struts-config.xml->plug-in节点下set-property的value设为"ApplicationResources.properties"
2.在ApplicationResources.properties 写tip1=This is default value
3.在action里加一个类Env,是一个通用类,专门用来读属性文件的(可以直接拷就可以了)
4.在MyPlugIn的init方法里
Env env=Env.getInstance(data);
arg0.getServletContext().setAttribute("pro", env);
//把env对象保存到application里,比如:以后在页面去值${applicationScope.env.tip1}
其中,data是MyPlugIn里的属性
5.在页面success.jsp页面加${applicationScope.env.tip1},运行看效果
3.这次犯的小错误
1.processPreprocess书写 浪费了时间(浪费时间:15分钟)
2.正确写法:${applicationScope.data}(正确) 错误写法:${application.data}(浪费时间:30分钟,郁闷)
4.error的运用(示例项目struts_error)
1.error可以放在3个地方
1.放在LoginForm的validate方法里
Errors放在ActionForm里
Errors放在ActionForm里
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
ActionErrors errors = new ActionErrors();
if(username.length()<3)
errors.add("username", new ActionError("userlength"));
if(password.length()<3)
errors.add("password", new ActionError("pwdlength"));
return errors;
说明:errors.add("username", new ActionError("userlength"));
1.username是login.jsp页面里的<html:errors property="password"/>
2.userlength是在ApplicationResources.properties里设置的
如:userlength= username must be more than 3
2.可以放在LoginAction中
Error放在LoginAction中
Error放在LoginAction中
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
ActionErrors errors = new ActionErrors();
if(loginForm.getUsername().length()<3){
errors.add("username", new ActionError("userlength"));
}
if(loginForm.getPassword().length()<3)
errors.add("password", new ActionError("pwdlength"));
if(errors!=null&&!errors.isEmpty())
{
this.saveErrors(request, errors);
return new ActionForward(mapping.getInput());
}
说明:这次多了2句话
this.saveErrors(request, errors);
return new ActionForward(mapping.getInput());
//将errors保存在request 然后转发到input指向的页面
//(在struts-config的action-mappings的action节点下的input就是用来做错误处理的页面)
3.在LoginAction里做异常处理的时候用(与2相同)
此段代码 说明了在业务逻辑出错的时候,如何用errors保存
Error放在trycatch中
Error放在trycatch中
LoginForm loginForm = (LoginForm) form;
LoginService loginService=LoginFactory.getLoginServiceImpl();
ActionErrors errors = new ActionErrors();
boolean result=false;
try{
result=loginService.verify(loginForm);
}
catch(Exception e){
e.printStackTrace();
errors.add("service",new ActionError("serviceerror"));
this.saveErrors(request,errors);
return mapping.findForward("error");
}
if(result)
return mapping.findForward("success");
else
return mapping.findForward("failure");
测试此段代码条件:需要在业务逻辑制造个异常,比如:可以在loginService.verify(loginForm)方法加个int i=10/0;
5.总结:
1.RequestProcessor类的processPreprocess(rq,res)作用:
1.目的:在进入LoginAction之前,可以做些控制 //详细还待查资料
2. MyPlugIn extends PlugIn 作用:
1.流程:在Tomcat第一次启动的时候,通过struts-config里<plug-in>节点,
然后在MyPlugIn的init方法里,把data放进application里,
其中,在<plug-in>节点配置的时候,data属性的value值,可以使*.properties文件
3.error 在页面有<html:errors property="password"/>
1.流程:把ActionError存到ActionErrors里,然后保存到request里,
然后在页面用request.getAttribute("password")取值
6.代码 代码下载