对大家很有意义的一个问题,建议大虾、菜鸟们都来讨论讨论#¥#·#¥·#%#¥%#¥% 在一些正规的项目里都是由美工专门写html页,但其中留有放置java代码的位置。没有必要专门写函数来作吧。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没有吧,我想专门的写html程序员也应该要了解一下程序,不是学,是了解。 在B/S软件开发中,为了对美工(页面、HTML)和程序员(程序)进行合理分工,使他们各行其事,互不影响,应该设计一个函数,专门用于将HTML文档读到程序中进行处理,完成后在用程序的输出语句输出页面,这样做是不现实的。HTML太复杂了,你怎么分析处理?难度大过本身项目的开发。关键是要在初期规划好,后期不要做大的改动。这样各个角色分别工作,最后合成就是了。 美工(页面、HTML)和程序员(程序)进行合理分工,使他们各行其事,互不影响,应该设计一个函数,专门用于将HTML文档读到程序中进行处理,完成后在用程序的输出语句输出页面这完全是合理的,我们公司就是这样做的out.println(xxxx())呵呵 那个xxxx()函数就不好告诉大家了只想告诉大家 这样写才能使view和control很好的分离 我做过这个处理, 如在使用时生成是不现实的因为速度态慢 , 你可以在HTML和Control做好,然后由程序生成中间页面,该中间页面供用户使用.不过这个需和HTML协商好,在HTML要用Control到的地方做相应标记,然后结合html和Control文件生成另一中间页面.应完成了 to:advanced(超越) 兄:这个操作以前我们的确用到过,不过是在PHP中,至于JSP怎么处理,因为初次用它做工程,所以不太清楚,还请你研究研究,我们可以共同探讨。 to oldfisher(渔夫) 兄: 不要吝啬嘛,拿出来大家共享一下,或许会对你有所启发,或者会对你原来的程序有所发展呢~~~~~~~~~~! 怪我多嘴。只能说一点东东:过去人们说Servlet不好 指责它需要html一条一条的输出 烦琐所以Sun开发出jsp 但在jsp中混杂html语句和java语句的做法是不好的所以Sun建议的是用jsp做页面,Servlet在服务器端做处理我们开发时干脆就不用jsp 直接写Servlet反正运行时jsp也要转换为Servlet 而且转化是要浪费服务器时间的问题就回来了 如何避免在Servlet中一条一条的输出html语句做法是程序框架设计好后 美工做好界面交给程序员(当然也可以程序员做好大致的自己想要的框架 再让美工来美化)程序员在html文件中打上标签在向客户端输出时将其中的标签替换为要动态输出的内容比如从数据库检索出来的数据等这个过程就是那个xxxx()函数要做的工作在Servlet中就只是简单的out.println(xxxx())了在整个系统的Servlet中只有java代码很少有一条一条输出html语句的代码了至于如何打标签,如何替换就不说了一个函数,专门用于将HTML文档读到程序中进行处理,完成后再用程序的输出语句输出页面 goldsoft说的也就是这个道理了 我有段代码生成有兴趣的可以给email我发给你们 package easyhis;import java.io.*;import java.sql.*;import easyhis.OpenDb;public class MainMenu{ public MainMenu() { } public String WriteMenu(String userName,String userPasswd,String userMenu) { try { File f1 = new File("e:/html/easyhis/tech/mainmenu.jsp"); FileWriter out = new FileWriter(f1); File f2 = new File("e:/html/easyhis/tech/menu.cwp"); FileReader in2 = new FileReader(f2); File f3 = new File("e:/html/easyhis/tech/menu.cmj"); FileReader in3 = new FileReader(f3); easyhis.OpenDb myOpenDb=new easyhis.OpenDb(); ResultSet Rs=null; int n=0,k=0,rc=0; long len=0; String brno=null; char tmps[] = new char[20]; String graph[]=new String[20]; String color[]=new String[20]; String bgcolor[]=new String[20]; String rmsts[]=new String[20]; String sts=null,SQL=null; int stslen=0; char ch; k=0; Rs=myOpenDb.executeQuery("SELECT * FROM rmsts"); while(Rs.next()){ rmsts[k]=Rs.getString("rmsts"); graph[k]=Rs.getString("graph"); color[k]=Rs.getString("color"); bgcolor[k]=Rs.getString("bgcolor"); k++; } stslen=k; len=f2.length(); for(n=0;n<len;n++){ in2.read(tmps,0,1); ch=tmps[0]; out.write(ch); out.flush(); } in2.close(); out.flush(); out.write("<div id=\"ie5menu\" class=\"skin0\" onMouseover=\"highlightie5()\" onMouseout=\"lowlightie5()\" onClick=\"jumptoie5();\">"); out.write(" <span class=\"title\" id=\"title\" url=\"\"></span>"); out.write(" <div class=\"menuitems\" url=\"reserv.jsp\">预订</div>"); out.write(" <hr>"); out.write(" <div class=\"menuitems\" url=\"walkin.jsp\">入住</div>"); out.write(" <div class=\"menuitems\" url=\"javascript:checkin;\">快速入住</div>"); out.write(" <hr>"); out.write(" <div class=\"menuitems\" url=\"javascript:checkin;\">改为OK</div>"); out.write(" <div class=\"menuitems\" url=\"javascript:checkin;\">改为Dirty</div>"); out.write(" <div class=\"menuitems\" url=\"javascript:checkin;\">更改房态</div>"); out.write(" <hr>"); out.write(" <div class=\"menuitems\" url=\"javascript:checkin;\">输入预付款</div>"); out.write(" <div class=\"menuitems\" url=\"javascript:checkin;\">输入帐单</div>"); out.write(" <div class=\"menuitems\" url=\"javascript:checkin;\">结帐</div>"); out.write(" <div class=\"menuitems\" url=\"javascript:checkin;\">退房挂帐</div>"); out.write("</div>");// out.write("<script language=\"JavaScript1.2\">");// out.write("if (document.all && window.print) {");// out.write(" ie5menu.className = menuskin;");// out.write(" document.oncontextmenu = showmenuie5;");// out.write(" document.body.onclick = hidemenuie5;");// out.write("}");// out.write("</script>"); out.flush(); len=f3.length(); rc=0; for(n=0;n<len;n++){ in3.read(tmps,0,1); ch=tmps[0]; if(ch=='@'){ rc=1; brno=""; continue; } if(rc>0&&ch>='0'&&ch<='9'){ brno=String.valueOf(new StringBuffer(brno+ch)); continue; } if(rc>0&&(ch<'0'||ch>'9')){ rc=0; SQL=String.valueOf(new StringBuffer("SELECT * FROM rmlst where rno="+brno)); Rs=myOpenDb.executeQuery(SQL); if(Rs.next()){ sts=Rs.getString("curdsts"); for(k=0;k<stslen;k++)if(rmsts[k].equals(sts))break; if(graph[k]==null||graph[k].length()<1){ out.write("<font color=\"#"+String.valueOf(color[k])+"\""); if(bgcolor[k]!=null && bgcolor[k].length()>0)out.write(" bgcolor=\"#"+String.valueOf(bgcolor[k])+"\""); out.write(" oncontextmenu=\"showmenu('"+String.valueOf(brno)+"');\" onClick=\"hidemenuie5();\" onMouseover=\"showmesg('"+String.valueOf(brno)+"');\" onMouseout=\"hidemesg();\">"); out.write(brno); out.write("</front>"); } else { out.write("<img src=\""+String.valueOf(graph[k])+"\""); out.write(" oncontextmenu=\"showmenu('"+String.valueOf(brno)+"');\" onClick=\"hidemenuie5();\" onMouseover=\"showmesg('"+String.valueOf(brno)+"');\" onMouseout=\"hidemesg();\">"); out.write(brno); out.write("</img>"); } } else out.write(brno); out.write(ch); out.flush(); continue; } out.write(ch); out.flush(); } in3.close(); out.close(); return null; } catch (IOException e) { return e.toString(); } catch(SQLException s){ return s.toString(); } }} 看了半天,没有搞明白大家说的什么。大概是指M、V的分离吧。大伙有人研究STRUTS吗?有时间看一下这个,对研究MV的分离很有帮助。 mvc模型啊。现在很流行,但是一般都用在大型项目,小东东没有必要用,用了反而有副作用。 对不起,出差一段时间,没顾得看帖子,大家聊了这么多了!!说得都很好,尤其是渔夫兄和goldsoft兄,不过,渔夫兄得回答更接近我问得这个问题得实质!但你还是没把那个函数贴上来啊!你不会那么小气吧?再次感谢大家!!好了,我先将我原来在PHP中用得函数贴上来!//# 函数get_templet()//# 得到模板文件的内容//# 输入:模板文件的位置//# 输出:模板文件的内容function get_templet(){ $sfile=Func_get_arg(0); $fd=fopen($sfile,'r'); $fgoutputstr=''; $buffer=''; while ($buffer = fgets($fd,1024)) { $fgoutputstr.=$buffer; } fclose($fd); return $fgoutputstr;}例:<?php$fgpagefile=("../../htdocs/templet/top.html"); $fgoutputstr=get_templet($fgpagefile);$cktruename="渔夫";$fgoutputstr= ereg_replace("matthew_name",$cktruename,$fgoutputstr);echo $fgoutputstr;?>最终输出结果位top.html页面,并且其中得所有matthew_name都已替换成“渔夫”!! aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 看了看,所要的好像与php 中用 perl 下的一模板类一样功能的类,我可以说jsp可以做出看来,我也找了好长时间没有找到,我正准备仿照perl下的模板类做一个jsp的模板类,不过是要费好大的精力的. 用Servlet来一条一条输出html语句是很烦琐的,从Servlet一诞生,人们就发现这毛病了当然就有人想: 一个函数,专门用于将HTML文档读到程序中进行处理, 完成后再用程序的输出语句输出页面所以这样的函数n年以前就有了 :)大伙看下 java servlet programming O'reilly出版java servlet 编程 电力出版社在426页的 Tea Template Language Manual的那段话 oldfisher(渔夫) ——你贴出来不就行了 ?别折磨我了!!OK???? 楼上说的很对,这样做效率极其低下,而且生成的页面过于庞大。对于美工和程序员的协调问题,一般现在用的是扩展JSP标签,不过也不能达到你想的那种完美的协调程序。 不如这样吧,所有程序员(程序)都去做XML,所有的美工(页面、HTML)都去搞XSL,这样显示和功能的一下就分开了,不是很好吗? 其实,虽说牺牲了一些速度,但是带来得是效率的大大提高。在做企业的基于B/S的MIS时,由于大多是局域网或者是宽带,对速度几乎没什么要求,并且用户也不会在速度上要求你给我必须怎么怎么样!这是我新做的解决上述问题的BEAN,好象还有点问题,请大家帮我测试测试!谢谢~~~~~~~~~~!另外,如果后期软件页面要改版,怎么办?是不是大伙(程序员、美工)全部上阵???如果分开的话,只要美工动动页面就行了!!!!!! 其实,美工写得可能不是一个完整的html页,而可能是一个功能块。一个完全没有问题的块,如何动态的吧这些块包(include)进来,才是高智商的程序员的工作。包进这些块,可以用和多方法,有jsp的自代的指令,你可以你写一个servlet的方法,来完成这个html功能块。 建议参考一下phplib的模板类,可以用java照它的思路自己做一个的。(我自己写了一个,要不要拿去试试?) rootwuyu(wuyu)兄:能不能把你的代码发给我??让我试试!!多谢!! 我写的一个连接MYSQL数据库的程序,总是报错,大家帮忙看看(同样有分!!!)//********************////mysql.java//********************//package test;import java.sql.*;public class mysql{ Connection sqlCon=null; //数据库连接对象 Statement sqlStmt=null; //SQL语句对象 ResultSet sqlRst=null;//结果集对象 public mysql(){ try{ Class.forName("org.gjt.mm.mysql.Driver").newInstance();; } catch(java.lang.ClassNotFoundException e){ System.err.println("mssql()"+e.getMessage()); } catch(java.lang.InstantiationException e){ System.err.println("mssql()"+e.getMessage()); } catch(java.lang.IllegalAccessException e){ System.err.println("mssql()"+e.getMessage()); } } public int Exec(String DataBase,String strSQL) { String url = "jdbc:mysql://localhost/test"; String user="root"; String password=""; int NumRows=0; try { sqlCon= DriverManager.getConnection(url,user,password); sqlStmt=sqlCon.createStatement(); //执行SQL语句并获取结果集 NumRows=sqlStmt.executeUpdate(strSQL); sqlStmt.close(); sqlCon.close(); } catch(Exception e) { e.printStackTrace(); } return NumRows; }}/////////////////////////////////////test.jsp<%@ page import="java.lang.*" %><%@ page import="java.util.*" %><jsp:useBean id="mysql" scope="page" class="test.mysql"/><% int i,j; i=1;j=1; Date date; j=mysql.Exec("test","create table mysql(num int)"); System.out.println(j);%> [问题]发布问题 . Struts2标签取数据问题 有没有懂迅雷专用链的? 【求助】JAVA WEB求助 在同一个页面中css咋不起作用了呢? jsp页中的变量怎样传给javascript 关于类库 括弧是不是应该先转换成别的符号呢? 请问一个项目开了多个线程,我怎么能操作其中的某一个线程呢 jsp传递数据 !!急求大神指导 表单提交能否给两个页面提供参数?在线给分 这段代码有什莫错误
out.println(xxxx())
呵呵 那个xxxx()函数就不好告诉大家了只想告诉大家 这样写才能使view和control很好的分离
不要吝啬嘛,拿出来大家共享一下,或许会对你有所启发,或者会对你原来的程序有所发展呢~~~~~~~~~~!
只能说一点东东:
过去人们说Servlet不好 指责它需要html一条一条的输出 烦琐
所以Sun开发出jsp
但在jsp中混杂html语句和java语句的做法是不好的
所以Sun建议的是用jsp做页面,Servlet在服务器端做处理
我们开发时干脆就不用jsp 直接写Servlet
反正运行时jsp也要转换为Servlet 而且转化是要浪费服务器时间的
问题就回来了 如何避免在Servlet中一条一条的输出html语句
做法是程序框架设计好后 美工做好界面交给程序员
(当然也可以程序员做好大致的自己想要的框架 再让美工来美化)
程序员在html文件中打上标签
在向客户端输出时将其中的标签替换为要动态输出的内容
比如从数据库检索出来的数据等
这个过程就是那个xxxx()函数要做的工作
在Servlet中就只是简单的out.println(xxxx())了
在整个系统的Servlet中只有java代码
很少有一条一条输出html语句的代码了
至于如何打标签,如何替换就不说了一个函数,专门用于将HTML文档读到程序中进行处理,
完成后再用程序的输出语句输出页面
import java.io.*;
import java.sql.*;
import easyhis.OpenDb;public class MainMenu
{
public MainMenu()
{
}
public String WriteMenu(String userName,String userPasswd,String userMenu) {
try {
File f1 = new File("e:/html/easyhis/tech/mainmenu.jsp");
FileWriter out = new FileWriter(f1);
File f2 = new File("e:/html/easyhis/tech/menu.cwp");
FileReader in2 = new FileReader(f2);
File f3 = new File("e:/html/easyhis/tech/menu.cmj");
FileReader in3 = new FileReader(f3);
easyhis.OpenDb myOpenDb=new easyhis.OpenDb(); ResultSet Rs=null;
int n=0,k=0,rc=0;
long len=0;
String brno=null;
char tmps[] = new char[20];
String graph[]=new String[20];
String color[]=new String[20];
String bgcolor[]=new String[20];
String rmsts[]=new String[20];
String sts=null,SQL=null;
int stslen=0;
char ch;
k=0;
Rs=myOpenDb.executeQuery("SELECT * FROM rmsts");
while(Rs.next()){
rmsts[k]=Rs.getString("rmsts");
graph[k]=Rs.getString("graph");
color[k]=Rs.getString("color");
bgcolor[k]=Rs.getString("bgcolor");
k++;
}
stslen=k;
len=f2.length();
for(n=0;n<len;n++){
in2.read(tmps,0,1);
ch=tmps[0];
out.write(ch);
out.flush();
}
in2.close();
out.flush();
out.write("<div id=\"ie5menu\" class=\"skin0\" onMouseover=\"highlightie5()\" onMouseout=\"lowlightie5()\" onClick=\"jumptoie5();\">");
out.write(" <span class=\"title\" id=\"title\" url=\"\"></span>");
out.write(" <div class=\"menuitems\" url=\"reserv.jsp\">预订</div>");
out.write(" <hr>");
out.write(" <div class=\"menuitems\" url=\"walkin.jsp\">入住</div>");
out.write(" <div class=\"menuitems\" url=\"javascript:checkin;\">快速入住</div>");
out.write(" <hr>");
out.write(" <div class=\"menuitems\" url=\"javascript:checkin;\">改为OK</div>");
out.write(" <div class=\"menuitems\" url=\"javascript:checkin;\">改为Dirty</div>");
out.write(" <div class=\"menuitems\" url=\"javascript:checkin;\">更改房态</div>");
out.write(" <hr>");
out.write(" <div class=\"menuitems\" url=\"javascript:checkin;\">输入预付款</div>");
out.write(" <div class=\"menuitems\" url=\"javascript:checkin;\">输入帐单</div>");
out.write(" <div class=\"menuitems\" url=\"javascript:checkin;\">结帐</div>");
out.write(" <div class=\"menuitems\" url=\"javascript:checkin;\">退房挂帐</div>");
out.write("</div>");
// out.write("<script language=\"JavaScript1.2\">");
// out.write("if (document.all && window.print) {");
// out.write(" ie5menu.className = menuskin;");
// out.write(" document.oncontextmenu = showmenuie5;");
// out.write(" document.body.onclick = hidemenuie5;");
// out.write("}");
// out.write("</script>");
out.flush();
len=f3.length(); rc=0;
for(n=0;n<len;n++){
in3.read(tmps,0,1);
ch=tmps[0];
if(ch=='@'){
rc=1;
brno="";
continue;
}
if(rc>0&&ch>='0'&&ch<='9'){
brno=String.valueOf(new StringBuffer(brno+ch));
continue;
}
if(rc>0&&(ch<'0'||ch>'9')){
rc=0;
SQL=String.valueOf(new StringBuffer("SELECT * FROM rmlst where rno="+brno));
Rs=myOpenDb.executeQuery(SQL);
if(Rs.next()){
sts=Rs.getString("curdsts");
for(k=0;k<stslen;k++)if(rmsts[k].equals(sts))break;
if(graph[k]==null||graph[k].length()<1){
out.write("<font color=\"#"+String.valueOf(color[k])+"\"");
if(bgcolor[k]!=null && bgcolor[k].length()>0)out.write(" bgcolor=\"#"+String.valueOf(bgcolor[k])+"\"");
out.write(" oncontextmenu=\"showmenu('"+String.valueOf(brno)+"');\" onClick=\"hidemenuie5();\" onMouseover=\"showmesg('"+String.valueOf(brno)+"');\" onMouseout=\"hidemesg();\">");
out.write(brno);
out.write("</front>");
}
else {
out.write("<img src=\""+String.valueOf(graph[k])+"\"");
out.write(" oncontextmenu=\"showmenu('"+String.valueOf(brno)+"');\" onClick=\"hidemenuie5();\" onMouseover=\"showmesg('"+String.valueOf(brno)+"');\" onMouseout=\"hidemesg();\">");
out.write(brno);
out.write("</img>");
}
}
else out.write(brno);
out.write(ch);
out.flush();
continue;
}
out.write(ch);
out.flush();
}
in3.close();
out.close();
return null;
}
catch (IOException e) {
return e.toString();
}
catch(SQLException s){
return s.toString();
}
}
}
现在很流行,但是一般都用在大型项目,小东东没有必要用,用了反而有副作用。
说得都很好,尤其是渔夫兄和goldsoft兄,不过,渔夫兄得回答更接近我问得这个问题得实质!但你还是没把那个函数贴上来啊!
你不会那么小气吧?
再次感谢大家!!
好了,我先将我原来在PHP中用得函数贴上来!//# 函数get_templet()
//# 得到模板文件的内容
//# 输入:模板文件的位置
//# 输出:模板文件的内容
function get_templet()
{
$sfile=Func_get_arg(0);
$fd=fopen($sfile,'r');
$fgoutputstr='';
$buffer='';
while ($buffer = fgets($fd,1024))
{
$fgoutputstr.=$buffer;
}
fclose($fd);
return $fgoutputstr;
}
例:
<?php$fgpagefile=("../../htdocs/templet/top.html");
$fgoutputstr=get_templet($fgpagefile);
$cktruename="渔夫";
$fgoutputstr= ereg_replace("matthew_name",$cktruename,$fgoutputstr);
echo $fgoutputstr;?>
最终输出结果位top.html页面,并且其中得所有matthew_name都已替换成“渔夫”!!
从Servlet一诞生,人们就发现这毛病了
当然就有人想:
一个函数,专门用于将HTML文档读到程序中进行处理,
完成后再用程序的输出语句输出页面
所以这样的函数n年以前就有了 :)
大伙看下 java servlet programming O'reilly出版
java servlet 编程 电力出版社
在426页的 Tea Template Language Manual的那段话
别折磨我了!!
OK????
这是我新做的解决上述问题的BEAN,好象还有点问题,请大家帮我测试测试!
谢谢~~~~~~~~~~!
另外,如果后期软件页面要改版,怎么办?
是不是大伙(程序员、美工)全部上阵???
如果分开的话,只要美工动动页面就行了!!!!!!
包进这些块,可以用和多方法,有jsp的自代的指令,你可以你写一个servlet的方法,来完成这个html功能块。
能不能把你的代码发给我??
让我试试!!
多谢!!
//********************//
//mysql.java
//********************//package test;
import java.sql.*;
public class mysql
{
Connection sqlCon=null; //数据库连接对象
Statement sqlStmt=null; //SQL语句对象
ResultSet sqlRst=null;//结果集对象
public mysql(){
try{
Class.forName("org.gjt.mm.mysql.Driver").newInstance();;
}
catch(java.lang.ClassNotFoundException e){
System.err.println("mssql()"+e.getMessage());
}
catch(java.lang.InstantiationException e){
System.err.println("mssql()"+e.getMessage());
}
catch(java.lang.IllegalAccessException e){
System.err.println("mssql()"+e.getMessage());
}
}
public int Exec(String DataBase,String strSQL)
{
String url = "jdbc:mysql://localhost/test";
String user="root";
String password="";
int NumRows=0;
try {
sqlCon= DriverManager.getConnection(url,user,password);
sqlStmt=sqlCon.createStatement(); //执行SQL语句并获取结果集
NumRows=sqlStmt.executeUpdate(strSQL);
sqlStmt.close();
sqlCon.close();
}
catch(Exception e) {
e.printStackTrace(); }
return NumRows;
}
}
/////////////////////////////////////
test.jsp
<%@ page import="java.lang.*" %>
<%@ page import="java.util.*" %>
<jsp:useBean id="mysql" scope="page" class="test.mysql"/>
<%
int i,j;
i=1;j=1;
Date date;
j=mysql.Exec("test","create table mysql(num int)");
System.out.println(j);
%>