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处理。