2024年10月itemforward(这个服装品牌叫什么)

 更新时间:2024-10-12

  ⑴itemforward(这个服装品牌叫什么

  ⑵是IF的大写拼在一起的!是itemforward的缩写!这个牌子在国内不是很有名,但是各大商场都有卖!这个牌子都是大码男士的衣服。做的韩国风!比较受

  ⑶欢迎,是近两年刚进国内销售的!

  ⑷cocoscreator..渲染流程详解(七:ForwardRender

  ⑸全文共+字,分为个章节,由本人历时一周整理而来。由于篇幅问题,将本文分为个章节分开发布。全文(不详细描述了cocoscreator引擎的.版本中,web平台的js部分引擎的渲染流程。请将文章配合源码一起食用!

  ⑹?由于我尚在学习引擎源码中,文章可能有不正确的部分,所以我会不断更新内容。如有错误或补充,请留言交流!

  ⑺一:渲染流程中用到的核心类

  ⑻三:RenderFlow的运行逻辑

  ⑼四:Assembler的作用

  ⑽五:ModelBatcher数据合批

  ⑾七:ForwardRender

  ⑿ForwardRender继承于Base,是与底层渲染最靠近的类型,当上面的流程处理完毕后,会在ForwardRender的render()中处理当前场景的渲染状态,材质,光照,通道,着色器,更新着色器的统一变量。并在_draw()中调用device.draw()方法,进行绘制。

  ⒀部分重要的继承于Base的成员变量:_device:根据运行平台对应的绘制图形对象gfx.Device的实例,用于绘制图形到屏幕,类型定义于cocosd

  ⒁enderergfxindex.js。_programLib:管理shader定义,获取,检查等相关的变量。类型定义于cocosd

  ⒂enderercoreprogram-lib.js。_stagefn:保存有不同渲染通道的名称与其对应的不同渲染方法。ForwardRender中设置有shadowcast,opaque,transparent三种渲染通道。_viewPools:单个相机的描述数据类(View)的对象池。一个View对应一个相机。_drawItemsPools:渲染数据类的对象池,保存有每个渲染批次需要的model,effect等数据。_stageItemsPools:单个渲染通道需要渲染的数据的对象池,本质是对_drawItemsPools中的数据按照不同通道进行了分类。

  ⒃ForwardRender中定义的成员变量:_lights:保存所有灯光数据。_shadowLights:保存所有阴影灯光数据。

  ⒄类名ForwardRender翻译为前向渲染,泛指传统上只有Opaque和Transparent两个通道的渲染技术。cocos有三个渲染通道,渲染通道方法定义在_stagefn中。

  ⒅渲染管线具体详解请参考unity官方文档(对的,真要学cocos还得看unity的文档:内置渲染管线中的渲染路径

  ⒆vue中通过historyapi拦截浏览器的前进后退按钮事件

  ⒇现在vueRouter的模式基本都是history模式,它的实现是基于原生事件popstate来实现的。先看看MDN文档对这个api的解释:

  ⒈也就是说我们点击浏览器的前进、后退按钮或者在js中执行history.back()、history.forward()就会触发popstate事件。

  ⒉那这个api和vueRouter的history模式有什么关系呢?我们知道vue项目其实是个单页应用,大致结构如下:

  ⒊所以我们在项目中各种跳转切换页面,都不会去请求html资源,都是在一个html中完成dom切换,也就是更换route-view标签里面的内容,但是我们却可以通过浏览器的前进后退按钮进行页面切换,实现的关键就是去监听popstate事件,根据相关信息去更换route-view标签里面的内容。

  ⒋到这里需要再介绍一个api,history.pushstate同样看一下MDN文档的介绍:

  ⒌这个api会往浏览器的历史栈添加一个状态,举个不太切当的例子:比如现在在A页面,然后从A页面跳转到B页面,然后在B页面执行history.pushState(),此时点击浏览器的后退按钮不会返回A页面,而还是在B页面。

  ⒍两个api的MDN文档,推荐看一遍哦:popstatehistory.pushState

  ⒎所以vueRouter的history模式简单来说就是监听popstate事件,去执行切换显示dom的事件;然后当路由切换时,执行了history.pushState(),然后手动触发一遍切换显示dom的事件。

  ⒏现在回到标题,在vue中如何拦截浏览器的前进后退按钮呢?最近刚好遇到一个需求,需要此功能来实现:有一个列表组件list:

  ⒐列表页有很多数据,每条数据只展示基础信息,然后点击每条item,要展示每条item的详情,跳转到详情页。这种需求非常常见,也有很多种办法实现,比如动态路由,但是如果是动态路由,那么返回列表页的时候,列表页就会刷新,在没有keep-alive的情况。交互不太友好,我一般都是通过组件切换去实现:

  ⒑列表通过v-show显示隐藏,详情组件通过v-if来触发初始化。但这样写又有一个问题,当显示详情页的时候,通过浏览器的后退按钮是回不到列表页的,因为他们在同个组件同个路由中,只能通用自己写的返回按钮来实现,为了考虑用户习惯的行为,就要实现在详情组件中点击后退按钮时能返回到列表页。

  ⒒结合上面所说,在进入详情组件的时候,把这个行为当成进入一个新页面,所以就要往浏览器会话的历史堆栈中添加一个状态:

  ⒓history.state储存了当前浏览器会话的信息,包括前进是什么状态,后退是什么状态,上面例子中我往里面添加了一个id;history.pushState有三个参数,第一个参数就是state,第二个参数可以忽略,第三个参数url可选,vueRouter的切换就是通过第三个参数来指定,如果不传第三个参数,当前url就不会改变。

  ⒔当执行了上面的goDetail方法后,就会显示详情组件。假如列表页的路由的/list,从/home路由跳转过来的,那当显示详情页的时候,点击浏览器的后退按钮,因为已经执行了history.pushState,所以不会返回到/home路由,还是在/list路由。那么怎么实现当在详情组件的时候,点击后退按钮隐藏详情组件,显示列表呢?这时候就需要监听popstate事件了,我在history.pushState的时候,往state中添加了一个标识,key为id,通过判断是否有这个标识来切换组件:

  ⒕当显示详情组件的时候,点击后退按钮,触发了popstate事件,history.state回到未执行history.pushState的状态,也就是history.state没有id这个标识,所以会隐藏掉详情组件;此时,再点击浏览器的前进按钮,history.state就会返回到执行了history.pushState的状态,有id这个标识,就会显示详情组件。这样就显示了通过浏览器的前进后退来控制同个路由下组件的切换。

  ⒖本文基于在一个组件中切换列表与某条数据的详情需求来说,对于涉及到的两个historyapi还有很多理解不足的地方,如果你有更好的见解,请指教。

  ⒗我是鸭子,祝你幸福。

  ⒘forwarditem什么意思

  ⒙java开发手机浏览器只要最基本的功能

  ⒚WebBrowser.javapackageCH.源程序;/***网页浏览器主程序**WebBrowser.java*/importjava.awt.*;importjavax.swing.*;importjavax.swing.text.*;importjava.awt.event.*;importjavax.swing.event.*;importjavax.swing.border.*;importjavax.swing.filechooser.FileFilter;importjavax.swing.filechooser.FileView;importjava.io.*;importjava..*;importjava.util.*;publilassWebBrowserextendsJFrameimplementsHyperlinkListener,ActionListener{//建立工具栏用来显示地址栏JToolBarbar=newJToolBar();//建立网页显示界面JTextFieldjurl=newJTextField();JEditorPanejEditorPane=newJEditorPane();JScrollPanescrollPane=newJScrollPane(jEditorPane);JFileChooserchooser=newJFileChooser();JFileChooserchooser=newJFileChooser();StringhtmlSource;JWindowwindow=newJWindow(WebBrowser.this);JButtonbutton=newJButton(“窗口还原“);Toolkittoolkit=Toolkit.getDefaultToolkit();//建立菜单栏JMenuBarjMenuBar=newJMenuBar();//建立菜单组JMenufileMenu=newJMenu(“文件(F)“);//建立菜单项JMenuItemsaveAsItem=newJMenuItem(“另存为(A)...“);JMenuItemexitItem=newJMenuItem(“退出(I)“);JMenueditMenu=newJMenu(“(E)“);JMenuItembackItem=newJMenuItem(“后退“);JMenuItemforwardItem=newJMenuItem(“前进“);JMenuviewMenu=newJMenu(“视图(V)“);JMenuItemfullscreenItem=newJMenuItem(“全屏(U)“);JMenuItemsourceItem=newJMenuItem(“查看源码(C)“);JMenuItemreloadItem=newJMenuItem(“刷新(R)“);//建立工具栏JToolBartoolBar=newJToolBar();//建立工具栏中的按钮组件JButtonpicSave=newJButton(“另存为“);JButtonpicBack=newJButton(“后退“);JButtonpicForward=newJButton(“前进“);JButtonpicView=newJButton(“查看源代码“);JButtonpicExit=newJButton(“退出“);JLabellabel=newJLabel(“地址“);JButtonbutton=newJButton(“转向“);Boxadress=Box.createHorizontalBox();//ArrayList对象,用来存放历史地址privateArrayListhistory=newArrayList();//整型变量,表示历史地址的访问顺序privateinthistoryIndex;/****构造函数**初始化图形用户界面*/publicWebBrowser(){setTitle(“网页浏览器“);setResizable(false);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//为jEditorPane添加事件侦听jEditorPane.addHyperlinkListener(this);//为组件fileMenu设置热键‘F’fileMenu.setMnemonic(’F’);saveAsItem.setMnemonic(’S’);//为“另存为”组件设置快捷键为ctrl+ssaveAsItem.setAelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));exitItem.setMnemonic(’Q’);exitItem.setAelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,InputEvent.CTRL_MASK));//将菜单项saveAsItem加入到菜单组fileMenu中fileMenu.add(saveAsItem);//在菜单项中添加隔离fileMenu.addSeparator();fileMenu.add(exitItem);backItem.setMnemonic(’B’);backItem.setAelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,InputEvent.CTRL_MASK));forwardItem.setMnemonic(’D’);forwardItem.setAelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,InputEvent.CTRL_MASK));editMenu.setMnemonic(’E’);editMenu.add(backItem);editMenu.add(forwardItem);viewMenu.setMnemonic(’V’);fullscreenItem.setMnemonic(’U’);fullscreenItem.setAelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U,InputEvent.CTRL_MASK));sourceItem.setMnemonic(’C’);sourceItem.setAelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));reloadItem.setMnemonic(’R’);reloadItem.setAelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R,InputEvent.CTRL_MASK));ContainercontentPane=getContentPane();//设置大小scrollPane.setPreferredSize(newDimension(,));contentPane.add(scrollPane,BorderLayout.SOUTH);//在工具栏中添加按钮组件toolBar.add(picSave);toolBar.addSeparator();toolBar.add(picBack);toolBar.add(picForward);toolBar.addSeparator();toolBar.add(picView);toolBar.addSeparator();toolBar.add(picExit);contentPane.add(bar,BorderLayout.CENTER);contentPane.add(toolBar,BorderLayout.NORTH);viewMenu.add(fullscreenItem);viewMenu.add(sourceItem);viewMenu.addSeparator();viewMenu.add(reloadItem);jMenuBar.add(fileMenu);jMenuBar.add(editMenu);jMenuBar.add(viewMenu);setJMenuBar(jMenuBar);adress.add(label);adress.add(jurl);adress.add(button);bar.add(adress);//为组件添加事件监听saveAsItem.addActionListener(this);picSave.addActionListener(this);exitItem.addActionListener(this);picExit.addActionListener(this);backItem.addActionListener(this);picBack.addActionListener(this);forwardItem.addActionListener(this);picForward.addActionListener(this);fullscreenItem.addActionListener(this);sourceItem.addActionListener(this);picView.addActionListener(this);reloadItem.addActionListener(this);button.addActionListener(this);jurl.addActionListener(this);}/****实现监听器接口的actionPerformed函数*/publicvoidactionPerformed(ActionEvente){Stringurl=““;//点击转向按钮if(e.getSource()==button){//获得地址栏的内容url=jurl.getText();//url不为“”,并且以“if(url.length()》&&url.startsWith(“)){try{//JEditorPane组件显示url的内容链接jEditorPane.setPage(url);//将url的内容添加到ArrayList对象history中history.add(url);//historyIndex的数值设为history对象的长度-historyIndex=history.size()-;//重新布局jEditorPane.setEditable(false);//addbycopyeditor:)jEditorPane.revalidate();}catch(Exceptionex){//如果链接显示失败,则弹出选择对话框“无法打开该搜索页”JOptionPane.showMessageDialog(WebBrowser.this,“无法打开该搜索页“,“网页浏览器“,JOptionPane.ERROR_MESSAGE);}}//url不为“”,并且不以“elseif(url.length()》&&!url.startsWith(“)){//在url前面添加“url=“(url);history.add(url);historyIndex=history.size()-;jEditorPane.setEditable(false);//addbycopyeditor:)jEditorPane.revalidate();}catch(Exceptionex){JOptionPane.showMessageDialog(WebBrowser.this,“无法打开该搜索页“,“网页浏览器“,JOptionPane.ERROR_MESSAGE);}}//没有输入url,即url为空elseif(url.length()==){JOptionPane.showMessageDialog(WebBrowser.this,“请输入链接地址“,“网页浏览器“,JOptionPane.ERROR_MESSAGE);}}//输入地址后点击回车elseif(e.getSource()==jurl){url=jurl.getText();if(url.length()》&&url.startsWith(“)){try{jEditorPane.setPage(url);history.add(url);historyIndex=history.size()-;jEditorPane.setEditable(false);//addbycopyeditor:)jEditorPane.revalidate();jurl.setMaximumSize(jurl.getPreferredSize());}catch(Exceptionex){JOptionPane.showMessageDialog(WebBrowser.this,“无法打开该搜索页“,“网页浏览器“,JOptionPane.ERROR_MESSAGE);}}elseif(url.length()》&&!url.startsWith(“)){url=“(url);history.add(url);historyIndex=history.size()-;jEditorPane.setEditable(false);//addbycopyeditor:)jEditorPane.revalidate();}catch(Exceptionex){JOptionPane.showMessageDialog(WebBrowser.this,“无法打开该搜索页“,“网页浏览器“,JOptionPane.ERROR_MESSAGE);}}elseif(url.length()==){JOptionPane.showMessageDialog(WebBrowser.this,“请输入链接地址“,“网页浏览器“,JOptionPane.ERROR_MESSAGE);}}//另存为...elseif(e.getSource()==picSave||e.getSource()==saveAsItem){url=jurl.getText().toString().trim();if(url.length()》&&!url.startsWith(“)){url=“(!url.equals(““)){//保存文件saveFile(url);}else{JOptionPane.showMessageDialog(WebBrowser.this,“请输入链接地址“,“网页浏览器“,JOptionPane.ERROR_MESSAGE);}}//退出elseif(e.getSource()==exitItem||e.getSource()==picExit){System.exit();}//后退elseif(e.getSource()==backItem||e.getSource()==picBack){historyIndex--;if(historyIndex《)historyIndex=;url=jurl.getText();try{//获得history对象中本地址之前访问的地址url=(String)history.get(historyIndex);jEditorPane.setPage(url);jurl.setText(url.toString());jEditorPane.setEditable(false);//addbycopyeditor:)jEditorPane.revalidate();}catch(Exceptionex){}}//前进elseif(e.getSource()==forwardItem||e.getSource()==picForward){historyIndex++;if(historyIndex》=history.size())historyIndex=history.size()-;url=jurl.getText();try{//获得history对象中本地址之后访问的地址url=(String)history.get(historyIndex);jEditorPane.setPage(url);jurl.setText(url.toString());jEditorPane.setEditable(false);//addbycopyeditor:)jEditorPane.revalidate();}catch(Exceptionex){}}//全屏elseif(e.getSource()==fullscreenItem){booleanadd_button=true;//获得屏幕大小Dimensionsize=Toolkit.getDefaultToolkit().getScreenSize();Containercontent=window.getContentPane();content.add(bar,“North“);content.add(scrollPane,“Center“);//button为点击“全屏”后的还原按钮if(add_button==true){bar.add(button);}//为button添加事件button.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevt){WebBrowser.this.setEnabled(true);window.remove(bar);window.remove(toolBar);window.remove(scrollPane);window.setVisible(false);scrollPane.setPreferredSize(newDimension(,));getContentPane().add(scrollPane,BorderLayout.SOUTH);getContentPane().add(bar,BorderLayout.CENTER);getContentPane().add(toolBar,BorderLayout.NORTH);bar.remove(button);pack();}});window.setSize(size);window.setVisible(true);}//查看源文件elseif(e.getSource()==sourceItem||e.getSource()==picView){url=jurl.getText().toString().trim();if(url.length()》&&!url.startsWith(“)){url=“(!url.equals(““)){//根据url,获得源代码getHtmlSource(url);//生成显示源代码的框架对象ViewSourceFramevsframe=newViewSourceFrame(htmlSource);vsframe.setBounds(,,,);vsframe.setVisible(true);}else{JOptionPane.showMessageDialog(WebBrowser.this,“请输入链接地址“,“网页浏览器“,JOptionPane.ERROR_MESSAGE);}}//刷新elseif(e.getSource()==reloadItem){url=jurl.getText();if(url.length()》&&url.startsWith(“)){try{jEditorPane.setPage(url);jEditorPane.setEditable(false);//addbycopyeditor:)jEditorPane.revalidate();}catch(Exceptionex){}}elseif(url.length()》&&!url.startsWith(“)){url=“(url);jEditorPane.setEditable(false);//addbycopyeditor:)jEditorPane.revalidate();}catch(Exceptionex){}}}}/***保存文件*/voidsaveFile(finalStringurl){finalStringlinesep=System.getProperty(“line.separator“);chooser.setCurrentDirectory(newFile(“.“));chooser.setDialogType(JFileChooser.SAVE_DIALOG);chooser.setDialogTitle(“另存为...“);if(chooser.showSaveDialog(this)!=JFileChooser.APPROVE_OPTION)return;this.repaint();Threadthread=newThread(){publicvoidrun(){try{java..URLsource=newURL(url);InputStreamin=newBufferedInputStream(source.openStream());BufferedReaderbr=newBufferedReader(newInputStreamReader(in));FilefileName=chooser.getSelectedFile();FileWriterout=newFileWriter(fileName);BufferedWriterbw=newBufferedWriter(out);Stringline;while((line=br.readLine())!=null){bw.write(line);bw.newLine();}bw.flush();bw.close();out.close();StringdMessage=url+“已经被保存至“+linesep+fileName.getAbsolutePath();StringdTitle=“另存为“;intdType=JOptionPane.INFORMATION_MESSAGE;JOptionPane.showMessageDialog((ponent)null,dMessage,dTitle,dType);}catch(java..MalformedURLExceptionmuex){JOptionPane.showMessageDialog((ponent)null,muex.toString(),“网页浏览器“,JOptionPane.ERROR_MESSAGE);}catch(Exceptionex){JOptionPane.showMessageDialog((ponent)null,ex.toString(),“网页浏览器“,JOptionPane.ERROR_MESSAGE);}}};thread.start();}/***获得源代码*/voidgetHtmlSource(Stringurl){Stringlinesep,htmlLine;linesep=System.getProperty(“line.separator“);htmlSource=““;try{java..URLsource=newURL(url);InputStreamin=newBufferedInputStream(source.openStream());BufferedReaderbr=newBufferedReader(newInputStreamReader(in));while((htmlLine=br.readLine())!=null){htmlSource=htmlSource+htmlLine+linesep;}}catch(java..MalformedURLExceptionmuex){JOptionPane.showMessageDialog(WebBrowser.this,muex.toString(),“网页浏览器“,JOptionPane.ERROR_MESSAGE);}catch(Exceptione){JOptionPane.showMessageDialog(WebBrowser.this,e.toString(),“网页浏览器“,JOptionPane.ERROR_MESSAGE);}}/****实现监听器接口的hyperlinkUpdate函数*/publicvoidhyperlinkUpdate(HyperlinkEvente){/*if(e.getEventType()==HyperlinkEvent.EventType.ACTIVATED){Stringurl=jurl.getText();if(url.length()》&&url.startsWith(“)){try{jEditorPane.setPage(url);jEditorPane.revalidate();}catch(Exceptionex){}}elseif(url.length()》&&!url.startsWith(“)){url=“(url);jEditorPane.revalidate();}catch(Exceptionex){}}}*///Revisedbycopyeditor:)Nowwithnewcodetohelphyperlinktry{if(e.getEventType()==HyperlinkEvent.EventType.ACTIVATED)jEditorPane.setPage(e.getURL());}catch(Exceptionex){ex.printStackTrace(System.err);}}/*生成一个IE对象*/publicstaticvoidmain(Stringargs){try{UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());}catch(Exceptione){}WebBrowserwebBrowser=newWebBrowser();webBrowser.pack();webBrowser.setVisible(true);}}

  ⒛jsp有哪些动作作用分别是什么

  jsp动作JSP动作利用XML语法格式的标记来控制Servlet引擎的行为。利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。JSP动作包括:jsp:include:在页面被请求的时候引入一个文件。jsp:useBean:寻找或者实例化一个JavaBean。jsp:setProperty:设置JavaBean的属性。jsp:getProperty:输出某个JavaBean的属性。jsp:forward:把请求转到一个新的页面。jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记。.jsp:include动作该动作把指定文件插入正在生成的页面。其语法如下:<jsp:includepage=“relativeURL“flush=“true“/>前面已经介绍过include指令,它是在JSP文件被转换成Servlet的时候引入文件,而这里的jsp:include动作不同,插入文件的时间是在页面被请求的时候。jsp:include动作的文件引入时间决定了它的效率要稍微差一点,而且被引用文件不能包含某些JSP代码(例如不能设置HTTP头,但它的灵活性却要好得多。例如,下面的JSP页面把则新闻摘要插入一个“What’sNew?”页面。改变新闻摘要时只需改变这四个文件,而主JSP页面却可以不作修改:WhatsNew.jsp<!DOCTYPEHTMLPUBLIC“-//WC//DTDHTML.Transitional//EN“><HTML><HEAD><TITLE>What’sNew</TITLE></HEAD><BODYBGCOLOR=“#FDFE“TEXT=“#“LINK=“#EE“VLINK=“#AB“ALINK=“#FF“><CENTER><TABLEBORDER=BGCOLOR=“#EF“><TR><THCLASS=“TITLE“>What’sNewatJspNews.</TABLE></CENTER><P>Hereisasummaryofourfourmostrecentnewsstories:<OL><LI><jsp:includepage=“news/Item.html“flush=“true“/><LI><jsp:includepage=“news/Item.html“flush=“true“/><LI><jsp:includepage=“news/Item.html“flush=“true“/><LI><jsp:includepage=“news/Item.html“flush=“true“/></OL></BODY></HTML>.jsp:useBean动作jsp:useBean动作用来装载一个将在JSP页面中使用的JavaBean。这个功能非常有用,因为它使得我们既可以发挥Java组件重用的优势,同时也避免了损失JSP区别于Servlet的方便性。jsp:useBean动作最简单的语法为:<jsp:useBeanid=“name“class=“package.class“/>这行代码的含义是:“创建一个由class属性指定的类的实例,然后把它绑定到其名字由id属性给出的变量上”。不过,就象我们接下来会看到的,定义一个scope属性可以让Bean关联到更多的页面。此时,jsp:useBean动作只有在不存在同样id和scope的Bean时才创建新的对象实例,同时,获得现有Bean的引用就变得很有必要。获得Bean实例之后,要修改Bean的属性既可以通过jsp:setProperty动作进行,也可以在Scriptlet中利用id属性所命名的对象变量,通过调用该对象的方法显式地修改其属性。这使我们想起,当我们说“某个Bean有一个类型为X的属性foo”时,就意味着“这个类有一个返回值类型为X的getFoo方法,还有一个setFoo方法以X类型的值为参数”。有关jsp:setProperty动作的详细情况在后面讨论。但现在必须了解的是,我们既可以通过jsp:setProperty动作的value属性直接提供一个值,也可以通过param属性声明Bean的属性值来自指定的请求参数,还可以列出Bean属性表明它的值应该来自请求参数中的同名变量。在JSP表达式或Scriptlet中读取Bean属性通过调用相应的getXXX方法实现,或者更一般地,使用jsp:getProperty动作。注意包含Bean的类文件应该放到服务器正式存放Java类的目录下,而不是保留给修改后能够自动装载的类的目录。例如,对于JavaWebServer来说,Bean和所有Bean用到的类都应该放入classes目录,或者封装进jar文件后放入lib目录,但不应该放到servlets下。下面是一个很简单的例子,它的功能是装载一个Bean,然后设置/读取它的message属性。BeanTest.jsp<!DOCTYPEHTMLPUBLIC“-//WC//DTDHTML.Transitional//EN“><HTML><HEAD><TITLE>ReusingJavaBeansinJSP</TITLE></HEAD><BODY><CENTER><TABLEBORDER=><TR><THCLASS=“TITLE“>ReusingJavaBeansinJSP</TABLE></CENTER><P><jsp:useBeanid=“test“class=“hall.SimpleBean“/><jsp:setPropertyname=“test“property=“message“value=“HelloWWW“/><H>Message:<I><jsp:getPropertyname=“test“property=“message“/></I></H></BODY></HTML>SimpleBean.javaBeanTest页面用到了一个SimpleBean。SimpleBean的代码如下:packagehall;publilassSimpleBean{privateStringmessage=“Nomessagespecified“;publicStringgetMessage(){return(message);}publicvoidsetMessage(Stringmessage){this.message=message;}}.关于jsp:useBean的进一步说明使用Bean最简单的方法是先用下面的代码装载Bean:<jsp:useBeanid=“name“class=“package.class“/>然后通过jsp:setProperty和jsp:getProperty修改和提取Bean的属性。不过有两点必须注意。第一,我们还可以用下面这种格式实例化Bean:<jsp:useBean...>Body</jsp:useBean>它的意思是,只有当第一次实例化Bean时才执行Body部分,如果是利用现有的Bean实例则不执行Body部分。正如下面将要介绍的,jsp:useBean并非总是意味着创建一个新的Bean实例。第二,除了id和class外,jsp:useBean还有其他三个属性,即:scope,type,beanName。下表简要说明这些属性的用法。属性用法id命名引用该Bean的变量。如果能够找到id和scope相同的Bean实例,jsp:useBean动作将使用已有的Bean实例而不是创建新的实例。class指定Bean的完整包名。scope指定Bean在哪种上下文内可用,可以取下面的四个值之一:page,request,session和application。默认值是page,表示该Bean只在当前页面内可用(保存在当前页面的PageContext内。request表示该Bean在当前的客户请求内有效(保存在ServletRequest对象内。session表示该Bean对当前HttpSession内的所有页面都有效。最后,如果取值application,则表示该Bean对所有具有相同ServletContext的页面都有效。scope之所以很重要,是因为jsp:useBean只有在不存在具有相同id和scope的对象时才会实例化新的对象;如果已有id和scope都相同的对象则直接使用已有的对象,此时jsp:useBean开始标记和结束标记之间的任何内容都将被忽略。type指定引用该对象的变量的类型,它必须是Bean类的名字、超类名字、该类所实现的接口名字之一。请记住变量的名字是由id属性指定的。beanName指定Bean的名字。如果提供了type属性和beanName属性,允许省略class属性。.jsp:setProperty动作jsp:setProperty用来设置已经实例化的Bean对象的属性,有两种用法。首先,你可以在jsp:useBean元素的外面(后面使用jsp:setProperty,如下所示:<jsp:useBeanid=“myName“.../>...<jsp:setPropertyname=“myName“property=“someProperty“.../>此时,不管jsp:useBean是找到了一个现有的Bean,还是新创建了一个Bean实例,jsp:setProperty都会执行。第二种用法是把jsp:setProperty放入jsp:useBean元素的内部,如下所示:<jsp:useBeanid=“myName“...>...<jsp:setPropertyname=“myName“property=“someProperty“.../></jsp:useBean>此时,jsp:setProperty只有在新建Bean实例时才会执行,如果是使用现有实例则不执行jsp:setProperty。jsp:setProperty动作有下面四个属性:属性说明namename属性是必需的。它表示要设置属性的是哪个Bean。propertyproperty属性是必需的。它表示要设置哪个属性。有一个特殊用法:如果property的值是“*”,表示所有名字和Bean属性名字匹配的请求参数都将被传递给相应的属性set方法。valuevalue属性是可选的。该属性用来指定Bean属性的值。字符串数据会在目标类中通过标准的valueOf方法自动转换成数字、boolean、Boolean、byte、Byte、char、Character。例如,boolean和Boolean类型的属性值(比如“true”通过Boolean.valueOf转换,int和Integer类型的属性值(比如“”通过Integer.valueOf转换。value和param不能同时使用,但可以使用其中任意一个。paramparam是可选的。它指定用哪个请求参数作为Bean属性的值。如果当前请求没有参数,则什么事情也不做,系统不会把null传递给Bean属性的set方法。因此,你可以让Bean自己提供默认属性值,只有当请求参数明确指定了新值时才修改默认属性值。例如,下面的代码片断表示:如果存在numItems请求参数的话,把numberOfItems属性的值设置为请求参数numItems的值;否则什么也不做。<jsp:setPropertyname=“orderBean“property=“numberOfItems“param=“numItems“/>如果同时省略value和param,其效果相当于提供一个param且其值等于property的值。进一步利用这种借助请求参数和属性名字相同进行自动赋值的思想,你还可以在property(Bean属性的名字中指定“*”,然后省略value和param。此时,服务器会查看所有的Bean属性和请求参数,如果两者名字相同则自动赋值。下面是一个利用JavaBean计算素数的例子。如果请求中有一个numDigits参数,则该值被传递给Bean的numDigits属性;numPrimes也类似。JspPrimes.jsp<!DOCTYPEHTMLPUBLIC“-//WC//DTDHTML.Transitional//EN“><HTML><HEAD><TITLE>在JSP中使用JavaBean</TITLE></HEAD><BODY><CENTER><TABLEBORDER=><TR><THCLASS=“TITLE“>在JSP中使用JavaBean</TABLE></CENTER><P><jsp:useBeanid=“primeTable“class=“hall.NumberedPrimes“/><jsp:setPropertyname=“primeTable“property=“numDigits“/><jsp:setPropertyname=“primeTable“property=“numPrimes“/>Some<jsp:getPropertyname=“primeTable“property=“numDigits“/>digitprimes:<jsp:getPropertyname=“primeTable“property=“numberedList“/></BODY></HTML>注:NumberedPrimes的代码略。.jsp:getProperty动作jsp:getProperty动作提取指定Bean属性的值,转换成字符串,然后输出。jsp:getProperty有两个必需的属性,即:name,表示Bean的名字;property,表示要提取哪个属性的值。下面是一个例子,更多的例子可以在前文找到。<jsp:useBeanid=“itemBean“.../>...<UL><LI>Numberofitems:<jsp:getPropertyname=“itemBean“property=“numItems“/><LI>Costofeach:<jsp:getPropertyname=“itemBean“property=“unitCost“/></UL>.jsp:forward动作jsp:forward动作把请求转到另外的页面。jsp:forward标记只有一个属性page。page属性包含的是一个相对URL。page的值既可以直接给出,也可以在请求的时候动态计算,如下面的例子所示:<jsp:forwardpage=“/utils/errorReporter.jsp“/><jsp:forwardpage=“<%=someJavaExpression%>“/>.jsp:plugin动作jsp:plugin动作用来根据浏览器的类型,插入通过Java插件运行JavaApplet所必需的OBJECT或EMBED元素。

  PClogo全部命令

  DRAW-清除屏幕,海龟,画布颜色复制,海龟颜色回到原来的设置

  CLEAN屏幕清晰,乌龟,笔的颜色,画布的颜色,乌龟的位置角度不变

  CLEARSCREENCS(CS为清屏清屏,龟背原稿位置,笔色,画布色不变

  CLEARTEXTCT明确的命令区

  SPLITSCREENSS图文混合屏

  FULLSCREENFS全图形屏

  TEXTSCREENTS全文字屏

  NODRAWND全文字屏、清屏

  ITEM-输出表中第:K个元素

  IFTRUEIFT测试真

  IFFALSEIFF测试假

  KEY?-是否有键盘输入

  本次学习的LOGO命令有:

  DRAW清屏、复位、进入图文混合显示状态

  CLEARSCREEN简写CS清屏、复位

  SHOWTURTLE简写ST显龟命令

  HIDETURTLE简写HT隐龟命令

  FORWARD简写FD前进命令

  FD*前进步(因为*=

  FD-后退步(与BK作用相同

  BACK简写BK后退命令

  BK*后退步(因为*=

  BK-前进步(与FD作用相同

  RIGHT简写RT右转命令(顺时针方向

您可能感兴趣的文章:

相关文章