- 浏览: 1776117 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (641)
- vb2005xu自己动手系列 (174)
- vb2005xu开发文章转摘 (47)
- vb2005xu发发牢骚 (99)
- vb2005xu新技术灌水 (12)
- vb2005xu网络资源集锦 (21)
- vb2005xu软件学习 (60)
- 英语学习 (3)
- JavaScript 学习 (54)
- JAVA OOP 巩固 之 CustomDatabase 的开发 (5)
- 2013年9月之前所在公司 记事 (7)
- FleaPHP/QEEPHP 资料 (87)
- JAVA MAIL 学习篇 (4)
- Python turbogears (5)
- Rails 个人开发四部曲 (3)
- 名人传 (8)
- iwp framework (5)
- 高考零分作文 (5)
- startos (8)
- lua (0)
- 职场 (1)
最新评论
-
hellotieye:
自己 评论 自己 挺嗨呀
Mysql sql查询时 if 的用法 -
igevin:
转载请标明出处,转自Gevin的博客http://blog.i ...
RESTful API 编写指南 -
Theobob:
...
实现简单的ACL -
vb2005xu:
比如 对于 curl 调用就不再需要 加各种if 判断了,
$ ...
搞一个简单的数据打印工具AsDebug の Laravel -
vb2005xu:
http://geekplux.com/wiki/
YII2 模块内自定义错误页
我一个朋友初学JAVA,让我给他讲讲Web开发这方面的东西,老实说几年前用过的Struts现在早就忘光了...
平常接些JAVA单子基本也就用 nutz 和 spring mvc ,sese [自己拼的一个小框架] 这3种东西
但是这些对初学者似乎还是很复杂.
让我给他讲 struts 确实不会,就按我的思路给讲好了 ... 以上都是废话...
作为现在流行的java web开发框架,基本都是MVC导向的... 此处我就歪歪下自己的想法
剥掉 M 就只剩余 C + V ,把 JSP+JSTL+EL 指向 模版视图[V] , 那么把V完全可以无视了,此时只剩下控制器 C
现在很多框架把 控制器 使用非Servlet的类来实现,方便测试吧,可能... 那么此处也就遵循好了,方便测试吧...
public abstract class BaseController { protected IRequestEntry requestEntry ; public void init(){} public abstract boolean executeAction(String actionName) ; public static BaseController newInstance(String controllerClass) { try { Object controller = Class.forName(controllerClass).newInstance(); if (controller instanceof BaseController){ return (BaseController) controller ; } } catch(ClassNotFoundException ex){} catch(Exception ex){} return null ; } public IRequestEntry getRequestEntry() { return requestEntry; } public void setRequestEntry(IRequestEntry requestEntry) { this.requestEntry = requestEntry; } }
这样的控制器应该能够接受吧,算是基础类了吧... 无论是 spring mvc 还是 struts 基本都有一个分发器对象,用来将请求发送到 指定的控制器/Action里面,此处衍生了N多的XML配置文件,这样的我很不喜欢,说白了就是单一入口 的功能呗
我很讨厌 XML配置文件,很无语... 当初使用XML的目的,我感觉 应该是为了 解耦合和自定义常用参数 ... 可惜到现在膨胀到
方方面面 写代码的同时还要写XML,还美其名曰 为了解耦和 我不知道到底实现了没有 反正我不喜欢... 这也是我为什么从JAVA转行到PHP的原因之一.... 可能是我畏惧吧
IRequestEntry
作用就是 请求的入口点 里面封装了 常用的一些 方法:
public interface IRequestEntry extends IDataService { public String getRequestParameter(String parameter) ; public void setView(String view,String format) ; public void setView(String view) ; public void assign(String key,Object value) ; public boolean isPost() ; public boolean isGet() ; public boolean isAjax() ; }
IDataService
interface IDataService { public void service(Object request) throws Exception ; }
请求的入口点 的作用 最明显的就是 充当 分发器...
为了尽可能的不使用 配置文件 这里使用 惯例设置吧 通过URI中挂载的参数 来传递 控制器 和 action 名字进来 , 并通过这些信息来加载指定的控制器对象,这里
HttpRequestEntry
public class HttpRequestEntry extends HttpServlet implements IRequestEntry { // 控制器基本信息 private String controllerPackage = "" , currentController = "Application" ,currentAction = "index" ; private String viewBaseDir = "" ; private HttpServletRequest request = null ; public void init() throws ServletException { super.init(); this.setControllerPackage(this.getInitParameter("controllerPackage")); this.setViewBaseDir(this.getInitParameter("viewBaseDir")) ; // ServletContext context = this.getServletContext(); // -- load and init db pool } public void service(Object request) throws ControllerNotFound,ActionNotFound { // parseURI -- load controller String controllerClass = this.getControllerClass(this.currentController) ; BaseController controller = BaseController.newInstance(controllerClass) ; if (controller != null){ controller.setRequestEntry(this); boolean isExistAction = controller.executeAction(this.currentAction); if (!isExistAction){ throw new ActionNotFound(controllerClass,this.currentAction) ; } }else { throw new ControllerNotFound(controllerClass) ; } } /** * 每次Http请求,此方法仅仅执行一次 */ public void service(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException { this.request = request ; this.setCurrentController(request.getParameter("controller")); this.setCurrentAction(request.getParameter("action")); try { this.service(request); } catch (ControllerNotFound ex) { System.out.println(ex.getLocalizedMessage()); } catch (ActionNotFound ex) { System.out.println(ex.getLocalizedMessage()); } String viewName = this.getView() ; if (viewName != null){ // 渲染视图 String viewPath = "" ; if (this.viewBaseDir.endsWith("/")) viewPath = this.viewBaseDir + viewName ; else viewPath = this.viewBaseDir + "/" + viewName ; RequestDispatcher rd = this.getServletContext().getRequestDispatcher(viewPath); if (rd != null){ rd.forward(request, response); }else { System.out.println("cannot load view file: " + viewPath); } } } // public boolean forward(String path){} // public boolean redirect(String uri,int timeout){} public String getRequestParameter(String parameter){ return this.request.getParameter(parameter) ; } public void setView(String view,String format){ this.request.setAttribute("#view#",view) ; } public String getView(){ Object view = request.getAttribute("#view#") ; return view != null ? (String) view : null ; } public void setView(String view){ this.request.setAttribute("#view#","JSP") ; } public void assign(String key,Object value){ this.request.setAttribute(key, value) ; } public boolean isPost(){ return this.request.getMethod().equals("POST"); } public boolean isGet(){ return this.request.getMethod().equals("GET"); } public boolean isAjax(){ String r = this.request.getHeader("HTTP_X_REQUESTED_WITH") ; if (r != null && "xmlhttprequest".equals(r.toLowerCase())) return true ; return false ; } public String getControllerClass(String controller){ return this.controllerPackage == "" ? controller : this.controllerPackage + "." + controller ; } public String getCurrentController() { return this.currentController; } public void setCurrentController(String currentController) { if (currentController == null || "".equals(currentController.trim())) currentController = "Application" ; else currentController = com.moogens.Toolkit.toUpperFirstChar(currentController) ; this.currentController = currentController ; } public String getCurrentAction() { return this.currentAction; } public void setCurrentAction(String currentAction) { this.currentAction = currentAction == null ? "index" : currentAction ; } public String getControllerPackage() { return controllerPackage; } public void setControllerPackage(String controllerPackage) { this.controllerPackage = controllerPackage == null ? "" : controllerPackage; } public String getViewBaseDir() { return viewBaseDir; } public void setViewBaseDir(String viewBaseDir) { if (viewBaseDir == null || "".equals(viewBaseDir.trim() )) viewBaseDir = "/WEB-INF/views" ; if (!viewBaseDir.startsWith("/")) viewBaseDir = "/" + viewBaseDir ; String realBaseDir = getServletContext().getRealPath(viewBaseDir); File baseDir=new File(realBaseDir); if(!baseDir.exists()) baseDir.mkdir(); this.viewBaseDir = viewBaseDir; } }
重要的代码,此处因为每次HTTP请求只会执行1次,所以在这个方法里面去处理请求 并 负责常规的一些操作即可
public void service(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException { this.request = request ; this.setCurrentController(request.getParameter("controller")); this.setCurrentAction(request.getParameter("action")); try { this.service(request); } catch (ControllerNotFound ex) { System.out.println(ex.getLocalizedMessage()); } catch (ActionNotFound ex) { System.out.println(ex.getLocalizedMessage()); } String viewName = this.getView() ; if (viewName != null){ // 渲染视图 String viewPath = "" ; if (this.viewBaseDir.endsWith("/")) viewPath = this.viewBaseDir + viewName ; else viewPath = this.viewBaseDir + "/" + viewName ; RequestDispatcher rd = this.getServletContext().getRequestDispatcher(viewPath); if (rd != null){ rd.forward(request, response); }else { System.out.println("cannot load view file: " + viewPath); } } }
真正的数据处理的地方,加载控制器,执行action
public void service(Object request) throws ControllerNotFound,ActionNotFound { // parseURI -- load controller String controllerClass = this.getControllerClass(this.currentController) ; BaseController controller = BaseController.newInstance(controllerClass) ; if (controller != null){ controller.setRequestEntry(this); boolean isExistAction = controller.executeAction(this.currentAction); if (!isExistAction){ throw new ActionNotFound(controllerClass,this.currentAction) ; } }else { throw new ControllerNotFound(controllerClass) ; } }
控制器的一个例子
public final class Application extends BaseController { public Application() { // TODO: Add your code here } // 这个方法由子类自己实现,至于里面有多少个action 已经 action 对应的方法名字等等 必须在这里面 public boolean executeAction(String action) { if (action.equals("index")){ this.indexAction(); return true ; }else if (action.equals("show")){ this.showAction(); return true ; } return false ; } protected void indexAction(){ this.requestEntry.assign("title",this.toString() + " [indexAction]"); this.requestEntry.setView("application.jsp","JSP"); } protected void showAction(){ this.requestEntry.assign("title",this.toString() + " [showAction]"); this.requestEntry.setView("application.jsp","JSP"); } }
基本Over了 这样的代码 在 Tomcat6上 确实可以跑 不知道效率怎么样 我也不知道 .... 应该是够简单明了的
我从接触计算机书籍的第一天起, 就认准一个死理:”如果你想从垃圾堆中找点吃的, 那么你就买中国人写的计算机书籍吧.”
------------------------------------------------------
做过小结: 附件代码
- info.zip (16.8 KB)
- 下载次数: 28
评论
我也忘了
没过关(写错了.没关系),我也写了个类似的东东,参考下.呵呵.博主的博客相当给力啊!
我也忘了
没过关,我也写了个类似的东东,参考下.呵呵.博主的博客相当给力啊!
我也忘了
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="kencore" uri="http://moogens.info/kenjsp/taglib/core"%> <!DOCTYPE html> <html> <head> <title>后台管理 -- 猪猪阵营(我的小屋)</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <link rel="stylesheet" type="text/css" media="screen" href="${applicationScope.frontWebMaster.contextPath}css/app/accounts/style.css"> <script src="${applicationScope.frontWebMaster.contextPath}js/moogens.js" type="text/javascript"></script> </head> <body> <div id='container'> <div id='header'> <ul id="site_nav" class="nav"> <li><a href="#" class="homepage">首页</a></li> <li><a href="#">新闻</a></li> <li><a href="#">读书</a></li> <li><a href="#">应用</a></li> <li><a href="#">问答</a></li> <li><a href="#">更多</a></li> </ul> <ul id="user_nav" class="nav"> <li><a href="#">欢迎 <b>开发者</b></a></li> <li><a href="#">收件箱</a></li> <li><a href="#">我的应用</a></li> <li><a href="#">我的叽歪</a></li> <li><a href="#">设置</a></li> <li><a href="#">退出</a></li> </ul> </div><!-- end #header --> <div id='branding'> <div style="width: 800px;height: 80px;font-size: 2.8em;">后台管理</div> </div><!-- end #branding --> <div id='sidebar'> <ul> <li><a href='${applicationScope.frontWebMaster.contextPath}admin/application/config.php'>系统设置</a></li> <li><a href='${applicationScope.frontWebMaster.contextPath}admin/user/index.php'>用户管理</a></li> <li><a href='${applicationScope.frontWebMaster.contextPath}admin/appman/index.php'>应用管理</a></li> <li><a href='${applicationScope.frontWebMaster.contextPath}admin/news/index.php'>新闻管理</a></li> <li><a href='${applicationScope.frontWebMaster.contextPath}admin/comments/index.php'>评论管理</a></li> <li><a href='${applicationScope.frontWebMaster.contextPath}admin/attachment/index.php'>附件管理</a></li> <li><a href='${applicationScope.frontWebMaster.contextPath}admin/application/guard.php'>系统维护</a></li> </ul> </div><!-- end #sidebar --> <div id='mainContent'> <div id='contentBox'> <jsp:include page="${requestScope.contentPage}"></jsp:include> </div> <br class='clearfloat' /> </div><!-- end #mainContent --> <div id='footer'> <p>Copyright © 2010 猪猪阵营(我的小屋). All rights reserved.</p> </div><!-- end #footer --> </div><!-- end #container --> <script type="text/javascript" charset="utf-8"> </script> </body> </html>
package info.moogens.demo.pcmaster; import info.moogens.mvc.Controller; import info.moogens.mvc.UDI; import info.moogens.mvc.exception.ActionMistake; import info.moogens.mvc.view.JspHtmlView; import info.moogens.mvc.view.RawView; import info.moogens.mvc.view.RedirectView; public final class Application extends Controller { public void indexAction(){ this.setView(new JspHtmlView("application.jsp")) ; } public void rawAction() throws ActionMistake{ this.setView(new RawView("你的比赛打的垃圾博客")) ; } public void torootAction(){ this.setView(new RedirectView("/")) ; } public void togoogleAction(){ this.setView(new RedirectView("http://www.g.cn",2)) ; } public void tobaiduAction(){ this.setView(new RedirectView("http://www.baidu.com")) ; } public void toindexAction(){ this.forword("index"); } public void tobAction(){ UDI udi = UDI.parseUDIString("/b"); this.forword(udi); } }
package info.moogens.demo.pcmaster; import info.moogens.mvc.Controller; import info.moogens.mvc.exception.ActionNotFound; import info.moogens.mvc.view.JspHtmlView; import info.moogens.mvc.view.RawView; import info.moogens.mvc.view.RedirectView; public final class Application extends Controller { @Override public void executeAction(String actionName) throws ActionNotFound { do { if (actionName.equals("index")){ this.setView(new JspHtmlView("application.jsp")) ; break ; } else if (actionName.equals("raw")){ this.setView(new RawView("你的比赛打的垃圾博客")) ; break ; } else if (actionName.equals("toroot")){ this.setView(new RedirectView("/")) ; break ; } else if (actionName.equals("togoogle")){ this.setView(new RedirectView("http://www.g.cn",2)) ; break ; } else if (actionName.equals("tobaidu")){ this.setView(new RedirectView("http://www.baidu.com")) ; break ; } throw new ActionNotFound(this.getClass().getName(),actionName); } while(false) ; } }
package info.moogens.mvc; import info.moogens.mvc.exception.ViewNotFound; import info.moogens.mvc.exception.ViewRenderFailed; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public abstract class View { public static final String contentType_JSON = "application/json"; public static final String contentType_XML = "text/xml"; public static final String contentType_HTML = "text/html"; protected String contentType; public String getContentType() { return contentType; } protected void sendResponseContentType(HttpServletRequest request, HttpServletResponse response) { if (info.moogens.Toolkit.notEmpty(contentType)) { response.setContentType(contentType + ";charset=" + request.getAttribute("currentCharset")); } } /** * 渲染视图,此方法由HttpRequestMaster调用,开发者不应手动调用 * * 成功渲染必须返回null,否则继续返回视图对象 * * @param master * @param request * @param response * @return View * @throws ViewNotFound * @throws ViewRenderFailed */ public abstract View make(HttpRequestMaster master, HttpServletRequest request, HttpServletResponse response) throws ViewNotFound, ViewRenderFailed; }
JSP 生成HTML 模版的例子
package info.moogens.mvc.view; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import info.moogens.mvc.HttpRequestMaster; import info.moogens.mvc.View; import info.moogens.mvc.exception.ViewNotFound; import info.moogens.mvc.exception.ViewRenderFailed; public class JspHtmlView extends TemplateView { protected String contentType = View.contentType_HTML ; protected JspHtmlView(){} /** * template 文件名称 如果以 / 开始 则直接取 /下的JSP文件,否则调用 master.getViewBaseDir() 下的模版文件 * * @param template */ public JspHtmlView(String template) { this.template = info.moogens.Toolkit.notEmpty(template) ? template.trim() : null ; } @Override public View make(HttpRequestMaster master,HttpServletRequest request, HttpServletResponse response) throws ViewNotFound, ViewRenderFailed { if (template != null){ // 响应信息未发出时才能渲染 JSP视图 if (response.isCommitted()){ return new RawView("response had committed before render view: " + template); } String templatePath = template.startsWith("/") ? template : master.getViewBaseDir() + template ; RequestDispatcher rd = master.getServletContext().getRequestDispatcher(templatePath); if (rd == null) throw new ViewNotFound(template); try { rd.forward(request, response); } catch (ServletException e) { throw new ViewRenderFailed(template,e.getMessage()); } catch (IOException e) { throw new ViewNotFound(template); } finally { templatePath = null ; rd = null ; } } return null; } }
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <display-name>Kenjsp: Use simple tech create web project!</display-name> <description> 简易Servlet构建的站点 </description> <session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file> application.php </welcome-file> </welcome-file-list> <!-- <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>mypackage.Hello</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> --> <servlet> <description>网站前端应用入口</description> <servlet-name>front.entry</servlet-name> <servlet-class>info.moogens.web.HttpRequestEntry</servlet-class> <!-- //控制器设置 --> <init-param> <param-name>controllerPackage</param-name> <param-value>info.test.controller</param-value> </init-param> <!-- //视图设置 --> <init-param> <param-name>viewBaseDir</param-name> <param-value>/WEB-INF/views/front-entry</param-value> </init-param> <!-- //DB设置 --> <init-param> <param-name>dbDriver</param-name> <param-value>org.gjt.mm.mysql.Driver</param-value> </init-param> <init-param> <param-name>dbUrl</param-name> <param-value> jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8 </param-value> </init-param> <init-param> <param-name>dbUsername</param-name> <param-value>root</param-value> </init-param> <init-param> <param-name>dbPassword</param-name> <param-value>root</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>front.entry</servlet-name> <url-pattern>*.php</url-pattern> </servlet-mapping> <servlet> <description>网站后台应用入口</description> <servlet-name>admin.entry</servlet-name> <servlet-class>info.moogens.web.HttpRequestEntry</servlet-class> <!-- //控制器设置 --> <init-param> <param-name>controllerPackage</param-name> <param-value>info.test.controller</param-value> </init-param> <!-- //视图设置 --> <init-param> <param-name>viewBaseDir</param-name> <param-value>/WEB-INF/views/admin-entry</param-value> </init-param> <!-- //DB设置 --> <init-param> <param-name>dbDriver</param-name> <param-value>org.gjt.mm.mysql.Driver</param-value> </init-param> <init-param> <param-name>dbUrl</param-name> <param-value> jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8 </param-value> </init-param> <init-param> <param-name>dbUsername</param-name> <param-value>root</param-value> </init-param> <init-param> <param-name>dbPassword</param-name> <param-value>root</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>admin.entry</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!-- // 过滤器设置 --> <filter> <description>字符集过滤</description> <filter-name>charsetFilter</filter-name> <filter-class>info.moogens.web.tool.CharsetFilter</filter-class> <init-param> <param-name>charset</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <!-- // 仅仅对过滤*.php的请求 做字符集过滤--> <filter-name>charsetFilter</filter-name> <url-pattern>*.php</url-pattern> </filter-mapping> </web-app>
db
1. http://www.iteye.com/topic/370625
2. http://www.iteye.com/topic/66066
http://localhost:8080/kenjsp/application.php?action=show
发表评论
-
前端截取url成图片
2017-11-09 18:16 1554有些小需求需要将 url 转成图片, 直接使用 ... -
excel-to-csv-inbrowser
2016-08-15 19:20 2894# excel-to-csv-inbrowser exce ... -
ws-http 最简单轻量的PHP CURL工具库
2016-07-29 20:44 2616欢迎大家拍砖 https://github.com/to ... -
常用的 js 代码梳理
2016-06-16 12:00 1917/** * 格式化时间函数 * @param {form ... -
Facade 包装类 -- 解决视图里面长长的命名空间调用问题
2016-04-20 10:48 1744有时候模版里面定义 ... -
搞一个简单的数据打印工具AsDebug の Laravel
2016-01-20 19:47 2991很多时候我们都要纠结于代码开发过程中的数据 dump 工作 ... -
ken\trade
2015-12-18 20:45 1547<?php namespace ken\tra ... -
我承认我手贱: 升级 xcode
2015-11-14 21:11 1885升级 xcode 之后, 在终端运行 git clone 出现 ... -
YII2 模块内自定义错误页
2015-11-07 12:17 5508当前YII框架中把错误异常配置都放置在 web.php 中, ... -
PHP单例模式面试注意事项
2015-10-20 09:57 1950最近面了不少PHP从业者,有实习生也有5/6年以上的开发者 ... -
NGINX 配置 SSL 证书 搭建 HTTPS 网站
2015-10-19 19:19 2915下面是详细的配置过程: 1、在服务器上使用 Open ... -
关于php cron任务管理的实现假想
2015-10-17 21:25 1895之前每开发一个计划任务功能均需要在线上操作crontab来新 ... -
fineuploader 跨子域上传文件 cookie丢失问题的解决
2015-10-14 13:30 4811目前的项目中,使用到了fineuploader 这个纯htm ... -
CentOS 6安全加固及性能优化
2015-07-27 14:54 4293CentOS 6安全加固及性能优化 我们可以通过调整 ... -
常见票据辨别真伪的方法
2015-04-28 09:07 17391、真伪鉴别图示和步 ... -
梳理面试中遇到的HTTP协议相关的问题和知识
2015-04-16 13:45 3939本文会是一个比较长的,持续更新的过程 当你在浏览器地 ... -
面试中遇到的期权问题
2015-04-13 14:33 2741最近在面试一直遇到 ... -
遭遇windows上PHP 不能打开GBK编码文件名的问题
2015-03-09 11:21 3147我在 目录下建了一个文件名为 謀定三國-i8ujlw.js ... -
遭遇jsonp同域下变作post请求的坑
2015-01-28 21:39 4755今天迁移一个站点时遇到一个坑爹问题,同一个jsonp接口在 ... -
nginx 400 错误请求分析
2015-01-27 15:01 3335在服务器上传文件过程中 nginx经常会出现 400 的错误 ...
相关推荐
5. **JSP与Servlet交互**: JSP用于视图层,Servlet处理逻辑,两者协同工作时可能出现数据传递、请求转发和重定向的问题。理解JSP生命周期和Servlet生命周期是解决这类问题的关键。 6. **EJB与JMS集成**: EJB...
斯·高斯林( James Gosling)等人基于C+开发一种新的语言0 ak ( java的前身)。0ak是 种用于网络的精巧而安全的语言。Sun公司曾依此投标个交互式电视项目,但结果是被SGl 打败,Sun打算抛弃0ak。随着可联网的发展,Sun...
本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...
本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...
本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...
本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...
本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...
本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...
本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...
本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...
本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...
本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...
本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...
本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...
本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...
本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...
Struts是Apache软件基金会下的一个开源项目...通过分析Struts1和Struts2的源代码,我们可以深入了解这两个框架的工作原理,提高Java Web开发的技能。同时,理解这两种框架的差异,有助于选择更适合项目需求的解决方案。