java学习整理20170805

Struts1框架
a.定义通用控制器Controller,通过配置文件struts-config.xml对模型和视图进行隔离,并用Action(处理请求的接口)的概念对用户请求进行封装
b.控制器:ActionServlet根据配置文件进行转发映射,业务逻辑控制器,模型:各种形式的JavaBean,视图:JSP,Strust标签,ActionForm Bean(Struts1自动将请求的数据填充到对象中)
c.JSP Model1:JSP+JavaBean,实现了页面表现和业务逻辑的分离,但是JSP还是要负责V和C两部分
d.JSP Model2:JSP+Servlet+JavaBean,引入了MVC设计模式;而strust1则是为了更好的规范MVC开发而开发的一个框架
e.配置文件信息
web.xml:配置Struts1框架的核心控制器ActionServlet
struts-config.xml:配置Struts1框架的业务逻辑控制器(Action),模型(Model)和视图(View)
可选的应用资源文件:如国际化资源文件
f.ActionForm封装用户提交的表单内容,其成员属性名必须和表单元素同名才能接收到数据
g.项目中遇到的问题
纯Java项目使用的本地自己的JRE,那么classLoader在加载jar和class时候是分开的,对于我们自己编写的class,会在APP_HOME/bin下。导入的jar包或者user library的配置信息会
出现在APP_HOME/.classpath文件中,ClassLoader会很智能去加载这些classes和jar。而对于java web项目就不一样了,虽然eclipse的workspace中仍有.classpath文件,但即使你导
入的了自己定义的user library,它也不会出现在.classpath中,这就是问题的关键。对于java web项目,它最终不是通过本地的JRE去运行,而是部署到web 服务器,如Tomcat、
Weblogic、WebSphere等,这些服务器都实现了自身的类加载器。eclipse引用library 是为了编译代码生成WEB-INF/classes里面的class文件使用,使用eclipse j2ee IDE时,会将
WEB-INF/lib中所有的lib自动加入到library中。eclipse工程下的library是用来编译里面的src中java文件的,实际发布到tomcat时,仅仅只复制了WEB-INF/lib里面的jar包,所以出现
eclipse可以正常编译但tomcat运行是找不到类。
h.开发流程总结:
先创建JSP确定表单form,通过form建立继承ActionForm的form对应JavaBean,然后编写actionForm类实现业务逻辑,最后进行web.xml和strust-config.xml的配置
i.项目中遇到的问题
This error occurs when you try to display a JSP before the Struts ActionServlet has been initialized and is active. The causes for this error are usually either:
You failed to specify 2 for the Struts ActionServlet in your web.xml file or
You did specify the above, but the Struts ActionServlet didn't initialize properly because of an error. Check the log file entries
for the time period when the Server first starts up to see if it
initialized properly or
You accessed a JSP page directly without going through an action
由Module 'null' not found异常明白了<load-on-startup>的意义,在使用了html:html struts标签后,总是在报错:
解决:少加了<load-on-startup>0</load-on-startup>为什么要加这句呢,有时候没有加也可以执行?因为在servlet的配置当中,<load-on-startup>0</load-on-startup>,标记容
器是否在启动的时候就加载这个servlet,当值为0或者大于0时,表示容器在应用启动时就加载这个servlet 当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载,
正数的值越小,启动该servlet的优先级越高。如果不写,就在调用该servlet时,才进行加载,而在页面上用到了struts标签,而此时该servlet还未被加载所以会报错。
j.程序的国际化我们需要实行软编码,即通过加载不同资源文件显示不同的语言版本,而不用修改Web应用程序的源码,有利于程序移植;Bean:message标签获取<message-resource>里的资源
k.动态ActionForm
对于大型Web项目,我们需要写很多的ActionForm,同时表单元素很多时或者发生改变时,ActionFrom很难维护
动态:通过配置struts-config,而不用编程的方式创建ActionForm;<form-beans><form-bean name=""><form-property name="" type=""/></form-bean></form-beans>
缺点:使用动态ActionForm,配置文件太长。不如静态ActionForm清晰明了。
l:ActionServlet类(实现了Struts框架基于MVC模型的核心控制器):将模型层和视图层进行了分解
主要功能:接收用户请求;根据不同请求调用相应Action进行业务逻辑处理;从模型层获得处理后的数据并传给相应的视图层;选择合适的视图进行响应,并显示给用户
它是Struts框架提供的一个Serlvet,继承了HttpServlet
Web服务其加载了ActionServlet类后就立即执行他的init()方法进行初始化,做好接收用户请求的准备
init():
初始化Strust1框架内在的消息资源
根据web.xml加载ActionServlet的初始化参数(struts-config.properties)
根据web.xml加载ActionServlet的URL映射信息并注册DTD文件(/login.do)
根据需要进行模块初始化
ActionServlet接收并处理用户请求的核心方法是:process()方法,我们可以重写这个方法来扩展默认的ActionServlet类
真正处理HttpServletRequest和HttpServletResponse的是RequestProcessor类中的process()方法,而ActionServlet里的process方法会调用这个方法;这样实际是减轻了ActionServlet类
的负担,将其转移到了RequestProcessor类中的process()方法
RequestProcessor中的process()方法流程:
包装:调用processMultipart()方法,如果是以POST方式提交且请求类型是multipart/form-data的请求,则把request用MultipartRequsetWrapper包装类重新包装,否则直接返回原来的HttpServletRequest对象
获取请求URL路径:processPath()(选取ActionMapping对象时使用)
调用processLocale()方法:根据请求头信息为当前用户自动选取一个Locale对象,根据配置的Locale选项,会创建一个新的HttpSession(国际化资源配置文件)
......(其他函数)
真正处理用户请求的RequestProcess类实现了struts1框架的用户请求逻辑控制,扩展控制器应该在这里进行,而在ActionServlet类里重写init()方法只是用来完成自己的一些初始化工作
扩展的控制器继承RequestProcess类;同时在struts-config.xml文件中通过<controller>元素注册自定义的RequestProcess类
在编写Action类时,为了增强代码的重用性,不要将过多的业务逻辑放在一起,而是将他们分离交给专门的业务逻辑处理,如与数据库相关的业务
LoginForm loginForm=(LoginForm)form带来的问题:
Action与ActionForm是紧耦合的,只能一对一,
在不修改Action代码的情况下不能转换为使用动态ActionForm(动态:DynaActionForm login=(DynaActionForm)form;)
解决强制类型转换问题:
PropertyUtils类:读取普通JavaBean和ActionForm中属性的通用方法
m.将功能相似的多个Action合并:DispatchAction类和LookupDispatchAction类和MappingDispatchAction类
DispatchAction类:通过<action>里的parameter属性来控制
LookupDispatchAction类:继承的Action要重写getKeyMethodMap()方法,通过配置文件里的key来控制
MappingDispatchAction类:适用于跨页表单,相似的但不同页面的业务逻辑会放在继承类下的不同方法里实现,通过配置不同但单相似的<action>里的paramet属性来控制
IncludeAction类:将不是基于Struts1框架项目的JSP页面或者是Servlet整合到Struts里
SwitchAction类:模块切换,有利于功能分工
n.Struts1框架文件上传组件应用:org.apache.struts.upload.FormFile接口
getInputStream():获取封装在Action Form中的上传文件的数据流
getFileData():将文件内容放入byte数组中,适用于小文件
getFileName():只获取上传文件名
getFileSize():获取上传文件大小
getContentType():获取文件的内容类型
destroy():销毁所有和当前上传文件相关的资源
o.项目问题:上传文件后,服务器名称乱码
(1)在action里获取到文件名字符串后,对它进行编码处理Sring(string,Charset);
(2)自己继承ActionServlet类(关键方法init(),doGet(),doPost(),destroy(),process()),重写process()方法,或者doGet,doPost方法,在ActionServlet做出任何操作之前设置请求和响应的编码serCharacterEncoding(Charset);
(3)在web.xml中设置过滤器,在数据被封装到ActionForm之前进行编码设置<filter>标签
p.get方法传参中文乱码解决
在Action方法中对URIL请求参数进行单独编码;
编辑服务器的配置文件server.xml
q. <form name="bean 对象名称">
<field property="bean中的属性名"  depends="需要什么样的验证,可以为多个值,以逗号格开,值为方法的标志名">
  <arg name = "变量名" key = "properties文件的key,或者来自Var的name" resource = "是/否来自资源文件"/>
  <var>
<var-name>变量名</var-name>
<var-value>变量值</var-value>
  </var>
</field> 
 </form>
r.一旦出现资源找不到:资源并没有加载到web目录下;配置文件出现了问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值