`

抛弃框架的基于纯 Java Servlet 与 JSP的网站系统开发

阅读更多

我一个朋友初学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上 确实可以跑 不知道效率怎么样 我也不知道 .... 应该是够简单明了的

 

 

 

 

我从接触计算机书籍的第一天起, 就认准一个死理:”如果你想从垃圾堆中找点吃的, 那么你就买中国人写的计算机书籍吧.”

 

 

------------------------------------------------------

 

做过小结: 附件代码

4
2
分享到:
评论
14 楼 wuhen1230 2014-05-13  
wuhen1230 写道
vb2005xu 写道
wuhen1230 写道
附件需要解压密码啊.

我也忘了

没过关(写错了.没关系),我也写了个类似的东东,参考下.呵呵.博主的博客相当给力啊!

13 楼 wuhen1230 2014-05-13  
vb2005xu 写道
wuhen1230 写道
附件需要解压密码啊.

我也忘了

没过关,我也写了个类似的东东,参考下.呵呵.博主的博客相当给力啊!
12 楼 vb2005xu 2014-05-13  
wuhen1230 写道
附件需要解压密码啊.

我也忘了
11 楼 wuhen1230 2014-05-12  
附件需要解压密码啊.
10 楼 vb2005xu 2011-01-13  
看看 视图页面吧
<%@ 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 &copy; 2010 猪猪阵营(我的小屋). All rights reserved.</p>
			</div><!-- end #footer -->
			
				
		</div><!-- end #container -->
		
		
		<script type="text/javascript" charset="utf-8">
			
		</script>
    </body>
</html>
9 楼 vb2005xu 2010-12-31  
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);
	}
	
}
8 楼 vb2005xu 2010-12-30  
控制器的例子
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) ;		
	}

}
7 楼 vb2005xu 2010-12-30  
把视图 那块重新设计了下:
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;
	}
	
}
6 楼 vb2005xu 2010-12-23  
配置成功了 利用原始的 servlet映射 能够基本做到 URL路由的功能,正在实现 呵呵 为了周六而奋写 ... 这几天公司幸亏没有事情 日
<?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&amp;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&amp;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>
5 楼 vb2005xu 2010-12-23  
在社区找到两个好的帖子 比较适合我上边所说的东西 :

db
1. http://www.iteye.com/topic/370625
2. http://www.iteye.com/topic/66066
4 楼 vb2005xu 2010-12-22  
地址栏这么写: 暂时的写法:

http://localhost:8080/kenjsp/application.php?action=show
3 楼 houxinyou 2010-12-22  
这个东西挺好呀,在网页地址栏里应该怎么请求呀?
2 楼 ml365 2010-12-22  
呵呵。我刚学java的时候,也是从接触servlet开始的,那时候觉得java好轻便,还可以自己组合sql。后来越来越多的框架,我都是被迫学的。呵呵。无奈。支持下!
1 楼 vb2005xu 2010-12-22  
欢迎大家 评论啊

相关推荐

    Java经典入门教程pdf完整版

    斯·高斯林( James Gosling)等人基于C+开发一种新的语言0 ak ( java的前身)。0ak是 种用于网络的精巧而安全的语言。Sun公司曾依此投标个交互式电视项目,但结果是被SGl 打败,Sun打算抛弃0ak。随着可联网的发展,Sun...

    Struts2权威指南完整版

     本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...

    Struts 2.1 权威指南 part13 pdf

     本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...

    Struts 2.1 权威指南 part04 pdf

     本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...

    Struts 2.1 权威指南 part01 pdf

     本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...

    Struts 2.1 权威指南 part02 pdf

     本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...

    Struts 2.1 权威指南 part06 pdf

     本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...

    Struts 2.1 权威指南 part03 pdf

     本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...

    Struts 2.1 权威指南 part05 pdf

     本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...

    Struts 2.1 权威指南 part11 pdf

     本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...

    Struts 2.1 权威指南 part12 pdf

     本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...

    Struts 2.1 权威指南 part10 pdf

     本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...

    Struts 2.1 权威指南 part09 pdf

     本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...

    Struts 2.1 权威指南 part07 pdf

     本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...

    Struts 2.1 权威指南 part08 pdf

     本书适用于有较好的Java编程基础,有一定JSP、Servlet等Web编程基础或具备初步Java EE编程基础的读者。本书既给出了Struts 2入门级的示范实例,也详细讲解了Struts 2各个知识点及各个选项的详细用法,可以作为...

Global site tag (gtag.js) - Google Analytics