论坛首页 入门技术论坛

Servlet与Struts1.2简单总结

浏览 2738 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-09-20   最后修改:2009-09-21
servlet & struts 总复习
------------------------
1. Servlet 基础概念

HttpServlet extends Servlet
生命周期(init(), destroy(), service())
init(Config)->获得initParam
HttpServlet -> service()(获得当前提交的方式,分别调用doGet或者是doPost方法)
doGet/doPost(HttpServletRequest, HttpServletResponse)

1.1 现在没有其他的JSP内置对象

如何获得这些内置对象?
Session,Application,out->JspWriter
request.getSession()/request.getSession(boolean)
session.getServletContext()->application
response.getWriter()->PrintWriter

1.2 编码的问题

request的编码
如果没有在conf/server.xml做配置的话
在doGet,doPost方法中需要做不同的处理
否则, 直接在doPost做或者在filter里做
response 编码
response.setContentType("text/html; charset=GBK");
JS 的编码
out.println("<script>出错了("error");</script>");
---> 显示的都是乱码
解决方式一:中文部分特别做转码后再放进去
new String("出错了".getBytes("GBK"), "ISO8859-1");
解决方式二:
而是把信息放在request.setAttribute中

1.3 Servlet 做什么

出生的时候比JSP早, 古代的时候是拿Servlet来输出页面的
servlet 承担一个控制器的职责
纯JSP方式(不分层,所有代码都在页面上,包括业务逻辑, 包括访问数据库)类似ASP方式.
JSP + JavaBean 方式(JavaBean 可以是狭义上的, 属性和getter/setter方法
--> entity里的实体, 在广义上,一般的后台Java类)
<jsp:useBean> <jsp:getProperty> <jsp:setProperty>和后台的bean打交道.
这样的方式又叫model I
jsp+servlet+javabean -> model 2 -> MVC(Model-View-Controller)
DAO/Service -> 承担Model(访问数据库,执行业务逻辑)
entity -> 承担Model(把数据库的E-R变成OO)
Jsp -> 承担View职责, 只做把Controller转来的内容显示, 接收用户的输入,再提交.
配合上适当的标签, 就可以消灭小的脚本<% %>
Servlet -> 承担Controller职责,把页面的提交获取,调用M层的方法,最后把调用返回结果放在对应的页面内置对象中, 最后完成页面的转发或重定向.
具体来说, 一般一个Servlet中包括了如下步骤:
* 继承 HttpServlet
a, request.setCharEncoding("GBK");
b, 从request中获得提交内容: request.getParameter();->获得单个属性
request.getParameterValues();->获得数组
request.getParameterMap();->获得提交内容的Map封装,可以用BeanUtils.populate()填充.
在Servlet的提交里不会存在自定义对象, 集合对象(Struts才有的)
c, 对所有获得的这些内容要做转换和验证.
d, 根据需要封装entity中的实体对象
e, 实例化service的对象, 调用对应的业务方法
f, 返回结果放到request或者session或者是application上.
g, 根据不同的返回做不同的跳转或重定向.
request.getRequestDispatcher("xx.jsp").forward();

1.4 Servlet 如何配置

配置在web.xml中
<servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>xxx.xxx.xx.XXServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>action</servlet-name>
  <url-pattern>*.htm</url-pattern>
/aa/*.do -> error
*abc.jsp -> error
/*  -> Yes
*.do -> Yes
ACB - > Yes
</servlet-mapping>
多个servlet-mapping可以对应一个servlet配置段, 反之是不行的.
顺序无关
在<servlet>中可以配置一些其它的属性<init-param>
<param-name><param-value>, 在这里配置的属性将在init的时候被放在
config对象中, 我们可以通过getInitParameter()获得.

1.5 Servlet使用的注意事项

a, servlet是只被实例化一次的, 所以考虑到线程安全问题, 尽量在Servlet中写全局变量.
b, 所有的entity中的对象需要实现序列化接口.
c, 在servlet中, 如果说在response.sendRedirect()后还有代码,一定在sendRedirect后加一句return;

2. Filter

2.1 filter是实现Filter接口.
init(), destroy().
2.2 doFilter(request, response, chain)
2.3 是在过滤器chain上的, 顺序是由在web.xml里出现的顺序决定的.
2.4 request 的时候是写在前面的先被过滤到, response 是反过来接受到request时候的过滤.
chain.doFilter -> 向下一个过滤器提交
2.5 chain.doFilter(request, response), 如果写的url-pattern是*,Jsp也要经过Filter
2.6 如何配置,
<filter><filter-name><filter-class>
<filter-mapping><url-pattern>
* 有顺序要求, 先配先执行

2.7 如何写
2.7.1 转换成HttpServletRequest和HttpServletResponse

2.8 应用范围
转码, 验证, 权限, 防止盗链 -> 基本Filter可实现
替换, 压缩 -> HttpServletResponseWrapper: 装饰模式
* 首先在当前Filter中把原来的Response包装成自写的ResponseWrapper类
在doFilter()方法后
首先获得当前的包装对象, 对这个对象转成String,char[], byte[]
对转完的内容进行处理
处理完了以后,把处理结果通过真正的response给out出去.
在out.println()之前, 要修改真正的response对象的contentLength

3. Listener

3.1 和过滤器一样也是实现接口的.
3.2 request, Session, ServletContext
HttpSessionListener->监听创建和销毁的
HttpSessionAttributeListener -> 监听属性的增加删除和修改的
对于基本的监听器, 只需要在web.xml中配置一个<listener><listener-class>即可.

3.3 HttpSessionListener和HttpSessionBindingListener区别
HttpSessionListener: 整个应用就生成一个实例负责监听所有的session创建和销毁.
如果要做特别的处理就不好做了.
HttpSessionBindingListener:
valueBound()
valueUnBound()
可以每个不同的客户使用不同的监听器实例.
不需要在web.xml中配置.
session.setAttribute("aaaxx", new HttpSessionBindingListener())将触发valueBound方法
session.removeAttribute("aaaxx")或者session就销毁了那么就触发valueUnBound()方法.
为了标识不同的客户的不同监听器实例, 我们常常在自已写的BindingListener定义UserName, UserId
灵活但消耗资源.
3.4 所有的Listener所实现的方法里的参数都是event
在自已写Listeners的方法的时候,都要从event中来进一步获得内置对象
3.5 Listeners可以做什么?
初始化-> 把编码表的信息放在session里.
在application 上做一个监听器, 同时启动一个定时器, 这种应用是很常用的, 可以负责监控系统状态产生报警信息, 在线列表.

============================================================
------------------------------------------------------------

4. Struts整理流程

4.1 jsp -> ActionServlet -> RequsetProcessor(我们可以自己扩展的)
ActionServlet init()(读入配置文件的内容, 形成一个ModuleConfig, freeze())
doGet/doPost() -> process() -> requestProcessor.process()

4.2 RequestProcessor.process()方法
a, 获得ActionMapping
把页面上<form action="/x.do"> 和
struts-config.xml中的<action path="x" >对应.
b, 判断ActionMapping中的name, 有无对应的actionForm
c, 如果有name, 就进行填充
填充之前首先做二次接头,把<action name="abc">
和<form-bean name="abc">相对应.
如果对应上了,就根据<form-bean type="xx">
来实例化ActionForm对象,然后再填充,调用populate()方法填充的.
在填充之前, 如果有initial或者是reset方法,先做初始化.
d, ActionMapping中的validate是不是true, 如果是的话就验证(validate方法, 验证框架)

2.5 如果ActionErrors对象不为空(不是null, 而是里面有ActionError对象),返回到
input页面, 为空就继续

2.6 建立Action实例

2.7 调用Action有execute方法或者是根据parameter来决定调用分发Action中的具体方法

2.8 根据返回的ActionForward对象, 进行转发或者是重定向
ActionForward里有一个redirect属性决定是转发还是重定向
<forward name= path= redirect="true|false" >

3, Action 中
execute:
ActionMapping, ActionForm, HttpServletRequest, HttpSErvletResponse
返回的是个ActionForward
execute 中的执行流程
a, 避免直接在这个方法中写业务逻辑
把from强制转换成我们需要的类型.
b, 从ActionForm中取值
c, 验证(是验证业务逻辑)
d, 把值封装成VO对象
e, 调用对应的M层方法
f, 返回结果

导航文件:
1, 各个部分的元素是有顺序的.
2, data-sources
forbeans(当中有N个formbean)
nam 名字 type 所在类
globle-forward
name path 路径
action-mappings
<action name 对应form-bean 中的name
path 页面请求
attribute 对应范围的属性名
scope request或者session
type 对应的Action类的带包名的类名
parameter 丰富,主要用于分发,不同Action有不同的含义
input 错误跳转页面
validate true|false
roles 声明式定义权限"user, admin, sys"
forward(局部forward)
controller
processorClass 对应的扩展的RequestProcessor类
message-resources
  对应的资源文件的名字, 刻不带后缀, 不带国家地区代码
Plug-in 放验证框架

web.xml
ActionServlet
导航文件所在的位置
Minit-param><param-name>config
这里的<param-value>可以写多个用逗号隔开的配置文件.

5. ActionForm

6. Action
ForwardAction
<path="/" forward="" /> = <jsp:forward>
includeAction = <jsp:include>
SwitchAction->模块转换
分发Action
共同点:
1, 不能写execute()方法
2, 这里面都有一系列方法,方法签名都和execute相同.
3, 所有的分发Action都要利用到parameter参数
DispatchAction
带参数或隐藏表单域

8 自定义验证器
随便写个类,里面的方法是以validateXX形式开头
public static boolean validateXX(
	Object bean,
	Field field,
	ActionMessages messages,
	HttpServletRequest request,
	ValidatorAction va,
	Validator validator) {

  Field.getVarByValue("xx");
  Field.getProperty(); -> str
  BeanUtils.getProperty(bean, str);
  if(messages == null) messages = new ActionMessages();
  Resources.getActionMessage()->获得通过validation配置出来的错误消息.
}
修改validator-rules.xml在其中增加自已的验证类

  对于DispatchAction来说, 要想使用验证规则, 就必须要扩展原有的FieldCheck类
在所有的验证规则前都首先判断是否属于当前要验证的方法.

9 Struts标签
html, bean, logic, nested, tiles
html: 生成表单元素的, 显示错误消息的.
<html:form action="/xx">
<html:select property="xx">
  <html:options collection="xx"
property="xx"
labelProperty="xx" />
</html:select>
<html:errors><html:messages>

<form action="">
<html:text>
</form> --> 这样写要报错, 所以要使用HTML, 就要使用<html:form>
<html:submit>

bean -> 定义, 输出
<bean:write name="" property="" format="" > 可以是bean中的属性也可以是map中的key
里面不能有default
<bean:define id="" value="" />
<bean:define id="" name="" />
<bean:define id="" name="" property="" scope="" toScope="" />
<bean:message key="" bundle="" />
<bean:size id="" name="" />

logic -> 比较,判断, 迭代
<logic:equal>
<logic:empty> <logic:notEmpty>
<logic:present> <logic:notPresent> 是否存在
<logic:match location="start|end"> 字符串匹配
<logic:iterate name="" id="item" indexedId="index"(从1开始) offset="1" length="2">
<c:forEach items="${list}" var="item" varStatus="" begin="1" end="3">
<logic:iterate>可以遍历各类集合, 但是不能做空循环.
可以比较好的与Struts结合
<html:text property="num" indexed="true" />

nested -> 访问嵌套属性
tiles -> 做页面布局
Template Method
layout.jsp -> 模板页面
通过xml来决定以何种方式来填充模板来的不定的内容
要使用XML,就要把<tiles>框架通过<Plug-in>加入struts-config.xml文件.

论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics