浏览 2738 次
锁定老帖子 主题:Servlet与Struts1.2简单总结
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-09-20
最后修改:2009-09-21
------------------------ 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文件. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |