<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
path代表的是当前的request所在的上下文的环境
basePath就是基础路径:协议+://+服务器名称+端口号+当前的路径
basePath:http://ztd-pc:8080/Struts2-0500_ActionMethod_1/
request.getContextPath():/Struts2-0500_ActionMethod_1
实际上Action里面的方法作用在于为每一个特定的请求指明在Action中要调用的方法\
方法也可以不在struts.xml中定义而是在调用这个方法的时候直接的在Action的后边加上"!methodName"
这样做的好处是我们可以简化struts.xml,是代码变得更加的简介,其实这还不是最简洁的,最简洁的是:使用通配符
指定当前的struts为开发模式: <constant name="struts.devMode" value="true" />
配置package期中name和namespace都是根据需要去定名字的,但是这些名字最好是按照包的名字去取,因为这样
会使真实的Action所在的source包和当前的Action配置的包的名字一一对应,这样的好处就是清晰明了,当然namespace
是命名空间,当你要访问某一个Action的时候,必须要带上它的.
<package name="user" extends="struts-default" namespace="/user">
<action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
<result>/user_add_success.jsp</result>
</action>
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_add_success.jsp</result>
</action>
</package>
Action通配符配置:
<package name="actions" extends="struts-default" namespace="/actions">
<action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
<result>/Student{1}_success.jsp</result>
</action>
一个通配符只能够实现对方法的统配,如果要实现对Action和方法都可以统配的话,那么需要的是两个通配符
第一个通配符用来统配Action,第二个通配符用来统配方法和返回的结果
<!--这种通配符的配置看起来就更加具有诱惑力了-->
<action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
<result>/{1}_{2}_success.jsp</result>
<!-- {0}_success.jsp -->
</action>
</package>
设置字符的编码:<constant name="struts.i18n.encoding" value="UTF-8" />但是再好的设置还是没有把所有的页面的字符格式都统一称为UTF-8的好,这才是
解决问题的最有效的方法
当复制一个web项目的时候,除了需要修改一下当前的网站的名称之外还需要修改一下它的properties里面的Web属性里面的Web Content-root这个才是在tomcat会去查找的网站的根的路径
<s:fielderror>用法:
其中fieldName指定的是出错的属性的名字,theme指定的是错误显示的格式,simple的格式为一种<ul><li></li></ul>的格式
在后台指定filedName和消息,
this.addFieldError("name", "对不起不是管理员,不准进入!");
this.addFieldError("name", "还是不行!");
this.addFieldError("age", "年龄有问题大哥!");
this.addFieldError("age", "AGE FORMAT IS WRONG!!!!");
前台获取消息,获取的时候可以使用
<s:fielderror fieldName="name" theme="simple">
<s:property value="errors.name[0]"/>
</s:fielderror>
形式,也可以直接的使用
<s:property value="errors.name[0]"/>
这种形式,而且可以指定某一个fieldName里面的第几个错误,因为它是数组的格式返回过来的
问题:取得map类型request,response,application,真实类型:HttpServletRequest,HttpSession,ServletContext的引用
Struts的前三者为什么依赖于容器?????
它们有什么区别???区别在于第一个1500后边有两个"_"
而下面的只有一个"_"
http://ztd-pc:8080/Struts2_1500__ResultType_1/
http://ztd-pc:8080/Struts2_1500_ResultType_1/
而下面的区别在于第一个Element里面的"l"是小写的,而后边的是大写的
http://ztd-pc:8080/Struts2_1200_AccessWebElements_1/
http://ztd-pc:8080/Struts2_1200_AccessWebELements_1/
为form赋值的时候直接把当前要访问的Action放上去就可以了,因为浏览器会默认的帮助我们把项目的名字加上去的
http://ztd-pc:8080/Struts2_1200_AccessWebELements_1/login/login1
这说明struts2里不同的标签对ognl的表达式的理解是不一样的。如果当有的标签“看不懂”类似“#myMap['key1']”的语句时,就要用%{}来把这括进去,“翻译”一下了。
包含其他的struts.xml文件 <include file="login.xml" />
配置常量::<constant name="struts.i18n.encoding" value="UTF-8" /> 开发方式 <constant name="struts.devMode" value="true" />
配置默认的jsp
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index"></default-action-ref>
<action name="index">
<result>/default.jsp</result>
</action>
</package>
http://ztd-pc:8080/Struts2_1500__ResultType_1/
http://ztd-pc:8080/Struts2_1500_ResultType_1/
接口包:userDAO只是单纯的负责与数据库打交道
实体包:项目中使用到的实体
服务包:专门为了实现业务而使用的包
面向接口编程的好处:
可以为接口添加多个不同的实类,根据业务需求去实例化一个接口的子类,一个具体对象,而具体的功能不用变
接口可以继承,方法不用全部的去使用,可以使用一个或者多个.
面向抽象编程的好处:就是灵活
映射和反射的区别:映射是一对一的,而反射是一种查找的方法.
设置el表达式可用
<%@ page isELIgnored="false" %>
i18n.reload、configuration.xml.reload
设置struts2为开发模式
<constant name="struts.devMode" value="true" />
Action的规定:
1.如果是普通类只需要有public String execute(){}方法就可以了
2.实现Action接口类
3.继承了ActionSupport类
在做项目的时候,如果一个项目是拷贝的另外的一个项目的话,除了需要给这个项目重新的命名之外,还需要修改它的Web Project Setting属性(eclipse里面是这样的),在myEclipse里面修改的也是webRoot属性好像是
而且在修改之后需要把tomcat清空,否则新建的项目很难被识别的
实际上在配置struts.xml的时候,<package>属性里面的name属性只是作为一个标记来使用的,用来告诉别人这个package里面定义的action都是用来处理哪一个包下面的action请求的并没有其他特殊的作用,不过一个好的习惯是按照包的名字来配置action这样做的好处是你可以很清楚的知道,哪一个包是干嘛的,也容易让别人来看
配置struts.xml的时候,实际上那个namespace跟实际的Action所在的类之间也没有必然的关系,它也是一个指示的标志,不过在访问具体的某个
Action的时候,你必须要把它给加上,如果不加那么程序会去默认的package里面去查找,如果配置了但是里面没有对应的action也是会报错的,它
的配置原则和name的配置原则是一模一样的,程序之所以可以可以调用配置好的Action是因为在配置package里面的action的时候需要指定类的位置,所以说对于Action的配置而言,很简单只需要把自己的package的名字配置的跟自己的Action所在的包的名字相同就可以了.
而result里面的返回的jsp页面的结果需要注意配置好它的位置,为什么呢?你不配置好的话,tomcat它是找不到的,在Action返回页面的时候,它是以当前的项目为根节点的,所以直接放在了webContent目录下面的文件需要"/"代表的是当前的web根目录下面的jsp文件,如果是webContent/aa则需要配置成为/aa/xxx.jsp
junit使用:junit3 过程:1.导入junit的jar包 2.要测试的类继承testCase类 3.被测试的方法命名为testxxx()
junit使用:junit4 可以使用junit3的方法,也可以直接在需要测试的方法上加上@org.junit.Test annotation然后方法命名为testxxx()就可以了
Eclipse3.5 反编译插件 在线安装 http://java.decompiler.free.fr/jd-eclipse/update
Eclipse3.5 svn 在线安装 http://subclipse.tigris.org/update_1.6.x
零碎知识
最新推荐文章于 2022-11-12 15:30:03 发布