struts part2

phase2 2012-5-10 start---------
1.<package>.....</package>中,method="add"表示调用class指定类中的add()方法或在url中动态指定调用方法名,

此称为DMI

2.wildcard通配符配置,struts配置中{1}通prepareStatement中ps.setString(1,...)中的1类似,即1代表匹配action name

中第一个*,同理{2}匹配第二个*,如:
<action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
 <result>/{1}_{2}_success.jsp</result>
</action>//约定优于配置。

3.部署项目时jre环境check:window--preference-java-installed jre选择所需版本;
  项目上右键-properties-java compile-complier compliance level设置所需版本;
  window-preference-myeclipse-servers-tomcat-tomcat 6.x-jdk-tomcat jre name设置所需版本;

4.jdk1.5与jdk1.6差别:在jdk1.5中实现了接口不能写@override,在jdk1.6中可以。

5.Action类里面可有三种方式来接收参数:用属性来接收参数;用域模型(延伸下可以用DTO接收);实现

ModelDriven<泛型类名>接口,此时代码中要有new 泛型类名(),前两种方式不用初始化属性或域模型且都有

get,set方法,第三种方式有getModel方法。

6. VO:value object
 DO:data object
 DTO:data transfer object

7. struts mvc中action----c   model-----m    jsp-----v

8.i18n即internationalization

9.struts中default.properties文件对constant值进行了设置

10.在jsp中添加<s:debug></s:debug>标签后,struts会将Action所有属性放入值栈中。<s:property>标签可以去除值

栈的值。值栈中errors为一个map1,其值又为一个map2,map2的值为一个字符串数组。如"errors.name[0]"表示

errors中值为name的第一个字符串。this.addFieldError("name","name is too long");

11.struts2加载常量的搜索顺序:struts-default.xml  struts-plugin.xml  struts.xml struts.properties web.xml。如果在多

个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值。

12.当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false,开发阶段最好打开。<constant

name="struts.configuration.xml.reload" value="true">。

13.struts2处理流程:用户请求--StrutsPrepareAndExecuteFilter--Interceptor--Action--Result--Jsp/html--响应。

14.可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml中包含其他配置文件。可以按模块来进

行配置。

15.struts2.1.6版本中存在一个bug,即接收到的中文请求参数为乱码(以post方式提交),原因是struts2.1.6在获取

并使用了请求参数后才调用HttpServletRequest的setCharacterEncoding()方法进行编码设置,导致应用使用的就是

乱码请求参数。解决方法:新建一个Filter,将这个Filter放置在struts2的Filter之前,然后在doFilter()方法里添加如下

代码:
public void doFilter(...){
 HttpServletRequest req = (HttpServletRequest)request;
 req.setCharacterEncoding("UTF-8");
 filterchain.doFilter(request,response);
}
后面版本也有解决。

16.public class DateConverter extends DefaultTypeConverter{
 @Override
 public Object convertValue(Map context,Object value,Class toType){
  SimpleDateFormat dateFormat = new SimpleDateFormat("yyyMMdd");
  try{
   if(toType==Date.class){
    String[] params=(String[])value;
    return dateFormat.parse(params[0]);
   }else if(toType==String.class){
    Date date = (Date) value;
    return dateFormat.format(date);
   }
  }catch(ParseException e){}
  return null;
 } 
}

17.多种按钮提交同一个form:<input type="button" value="submit1"

οnclick="javascript:document.f.action='login/login1';document.f.submit();"/>
<input type="button" value="submit2" οnclick="javascript:document.f.action='login/login2';document.f.submit();"/>
<input type="button" value="submit3" οnclick="javascript:document.f.action='login/login3';document.f.submit();"/>

18.得到request,session,application方法一:得到map类型的request,session,application:
public class LoginAction1 extends ActionSupport{//依赖容器struts2的ActionContext
 private Map request;
 private Map session;
 private Map application;

 public LoginAction1(){
  request  = (Map)ActionContext.getContext().get("request");//threadlocal 线程里是单


  session = ActionContext.getContext().getSession();
  application = ActionContext.getContext().getApplication(); 
 }
 
 public String execute(){
  request.put("r1","r1");//struts2内部会将map值处理成正真的

request,session,application前台就可以使用了。
  session.put("s1","s1");
  application.put("a1","a1");
  return SUCCESS;
 }
}

19.<s:property value="#request.r1"/>|<%=request.getAttribute("r1") %><br />
<s:property vaule="#attr.r1"/> attr可以搜索request,session,application 中是否有r1,如有会输出值;建

议不要使用,因为你自己应当清楚的知道要用request,session,application哪一个当中的r1。不然的

话request,session.application都有r1属性设置的话,就会混淆到底使用的哪一个中的r1。

20.threadlocal是线程名字和线程对应的值。

21.
得到request,session,application方法二(就用这种):
public class LoginAction2 extends ActionSupport implements

RequestAware,SessionAware,ApplicationAware{
 private Map<String,Object> request;
 private Map<String,Object> session;
 private Map<String,Object> application;

 public String execute(){
  request.put("r1","r1");
  session.put("s1","s1");
  application.put("a1","a1");
  return SUCCESS;
 }

 @Override//struts内部有来访问此方法DI dependency injection or IoC inverse of control
 public void setRequest(Map<String,Object> request){
  this.request = request;
 }

 @Override
 public void setSession(Map<String,Object> session){
  this.session = session;
 }

 @Override
 public void setApplication(Map<String,Object> application){
  this.application = application;
 }
}
struts会问loginaction是否有实现requestaware接口,loginaction说实现了,所以struts可以调用

requestaware接口的setRequest()方法,struts2是从filter开始,部署在struts容器里的filter当然可以拿

到httprequest对象,并将这个httprequest对象拿出放到一个map里面也起名为request作了一个映射


request在loginaction类里面定义,却要等struts2容器将具体对象注入进来,所以叫做依赖注入;以前

是自己new自己控制,而现在被别人初始化被别人控制了,所以也叫控制反转。

 

22.得到request,session,application方法三(基本不用):
public class LoginAction3 extends ActionSupport{
 private HttpServletRequest request;
 private HttpSession session;
 private ServletContext application;

 public LoginAction3(){
  request = ServletActionContext.getRequest();
  session = request.getSession();
  application = session.getServletContext();
 }

 public String execute(){
  request.setAttribute("r1","r1");
  session.setAttribute("s1","s1");
  application.setAttribute("a1","a1");
  return SUCCESS;
 }
}
23.得到request,session,application方法四(基本不用):
public class LoginAction4 extends ActionSupport implements ServletRequestAware{
 private HttpServletRequest request;
 private HttpSession session;
 private ServletContext application;

 public String execute(){
  request.setAttribute("r1","r1");
  session.setAttribute("s1","s1");
  application.setAttribute("a1","a1");
 } 

 @Override
 public void setServletRequest(HttpServletRequest request){
  this.request = request;
  this.session = request.getSession();
  this.application = session.getServletContext();
 }
}

24.
<package name="default" namespace="/" extends="struts-default">
  <default-action-ref name="index"></default-action-ref>
 <action name="index">
  <result>/default.jsp</result>
 </action>
</package>//default-action-ref效果就是访问时不写任何action时会显示default.jsp页面


25action总结:1.实现一个action最常用方式:从ActionSupport继承;2.DMI动态方法调用!;3.通配符配

置*{1}{2}...;4.接收参数的方法(一般用属性或者DomainModel来接收);5.简单参数验证addFieldError,

一般不使用struts2的ui标签;6.访问web元素:a.map类型(IOC,主动依赖Struts2) b.原始类型(IOC,主动

依赖Struts2);7.包含文件配置;8.默认action处理。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值