<?xml version="1.0" encoding="UTF-8"?>
<page xmlns="http://api.springnote.com">
  <identifier type="integer">1574342</identifier>
  <title>SView : S(cala|imple) View for Spring MVC = {</title>
  <relation_is_part_of type="integer">12059</relation_is_part_of>
  <date_modified type="datetime">2008-08-06T01:38:40Z</date_modified>
  <uri>http://anarch.springnote.com/pages/1574342</uri>
  <date_created type="datetime">2008-08-03T02:35:16Z</date_created>
  <source>&lt;h3&gt;SView : S(cala|imple) View for Spring MVC&amp;nbsp;&lt;/h3&gt;
&lt;h4&gt;&#46308;&#50612;&#44032;&#45716; &#47568;&lt;/h4&gt;
&lt;p&gt;smalltalk&#48512;&#53552; &#49884;&#51089;&#46108; MVC &#54056;&#53556;&#51008; SoC(Separation of Concerns, &#44288;&#49900; &#48516;&#47532;)&#51060;&#46972;&#45716; &#44288;&#51216;&#50640;&#49436; &#51025;&#50857; &#54532;&#47196;&#44536;&#47016;&#51032; &#48373;&#51105;&#46020;&#47484; &#44288;&#47532; &#54624;&#49688; &#51080;&#45716; &#50500;&#53412;&#53581;&#52432; &#54056;&#53556;&#51004;&#47196; &#51064;&#44592;&#44032; &#51080;&#49845;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;&#53945;&#55176; &#50937;&#50640;&#49436;&#45716; MVC &#54056;&#53556;&#51012; &#44396;&#54788;&#54620; &#47566;&#51008; &#54532;&#47112;&#51076;&#50892;&#53356;&#44032; &#51080;&#45716;&#45936;, &#45796;&#47480; &#45824;&#48512;&#48516;&#51032; &#50937; &#54532;&#47112;&#51076;&#50892;&#53356;&#50752; &#47560;&#52268;&#44032;&#51648;&#47196; Spring WebMVC&#45716; &#50668;&#47084; &#48624;/&#54532;&#47532;&#51232;&#53580;&#51060;&#49496; &#44592;&#49696;&#51012; &#53685;&#54633;&#54616;&#50668; &#49324;&#50857;&#54624;&#49688; &#51080;&#49845;&#45768;&#45796;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Scala&#45716;&amp;nbsp; JavaVM&#51060;&#45208; .NET CLR&#50948;&#50640;&#49436; &#46041;&#51089;&#54616;&#45716; &#44061;&#52404;&#51648;&#54693; &#54532;&#47196;&#44536;&#47000;&#48141;&#44284; &#54632;&#49688;&#54805; &#54532;&#47196;&#44536;&#47000;&#48141;&#51012; &#54844;&#54633;&#54620; multi-paradigm &#50616;&#50612;&#51077;&#45768;&#45796;.&amp;nbsp; &#50668;&#47084;&#44032;&#51648; &#55141;&#48120;&#47196;&#50868; &#53945;&#51669;&#51060; &#51080;&#51648;&#47564;, &#44061;&#52404;&#51648;&#54693; &#44592;&#48152;&#51032; &#54056;&#53556; &#47588;&#52845;&#44284; &#50616;&#50612; &#49888;&#53469;&#49828;&#52264;&#50896;&#50640;&#49436; &#51648;&#50896;&#54616;&#45716; XML Processing&#51008; XML &#52376;&#47532;&#50640; &#50857;&#51060;&#54620; &#53945;&#51669;&#51060; &#51080;&#49845;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;&#50948;&#51032; &#51060;&#47084;&#54620; &#53945;&#51669;&#46308;&#51012; &#51060;&#50857;&#54616;&#50668; &amp;nbsp;SpringMVC&#51032; View&#51012; Scala&#51032; XML Processing&#51012; &#51060;&#50857;&#54644;&#49436; &#44396;&#54788;&#54644;&#48372;&#50520;&#49845;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;&#44288;&#47144; &#49548;&#49828;&#45716; &lt;a href="http://github.com/anarcher/sview/tree/master"&gt;http://github.com/anarcher/sview/tree/master&lt;/a&gt; &#50640; &#51080;&#51004;&#47728;, git&#51012; &#51060;&#50857;&#54644;&#49436; &#48155;&#51004;&#49892;&#49688; &#51080;&#49845;&#45768;&#45796;. ( &lt;code&gt;git clone git://github.com/anarcher/sview.git&lt;/code&gt; )&lt;/p&gt;
&lt;h4&gt;SpringMVC&#51032; View,ViewResolver&lt;/h4&gt;
&lt;p&gt;&#45824;&#44060;&#51032; MVC &#54532;&#47112;&#51076;&#50892;&#53356;&#44032; &#44536;&#47084;&#54616;&#46319;&#51060; Spring WebMVC&#46020; View&#51012; &#49440;&#53469;&#54616;&#45716; &#44592;&#45733;&#51012; &#51228;&#44277;&#54633;&#45768;&#45796;. &#51060; &#48512;&#48516;&#50640; &#45824;&#54620; &#51473;&#50836;&#54620; &#46160;&#44060;&#51032; &#51064;&#53552;&#54168;&#51060;&#49828;&#44032; &#51080;&#45716;&#45936;, org.springframework.web.servlet.View&#50752; org.springframework.web.servlet.ViewResolver&#51077;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;ViewResolver&#51008; &#47568; &#44536;&#45824;&#47196; viewName &#44284; &#49892;&#51228; View&#51012; &#44208;&#51221;&#54644; &#51452;&#45716; &#44061;&#52404;&#51077;&#45768;&#45796;. View&#45716; &#45336;&#50612;&#50728; Request&#51012; &#54644;&#45817; View &#44396;&#54788;&#52404;&#50640;&#44172; &#50948;&#51076;&#54616;&#50668; &#52376;&#47532;&#54616;&#45716; &#44061;&#52404;&#51077;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;&#53945;&#55176; ViewResolver&#45716; &#45824;&#44060; Ordered &#51064;&#53552;&#54168;&#51060;&#49828;&#47484; &#44396;&#54788;&#54616;&#50668; &#50668;&#47084; ViewResolver&#51012;&amp;nbsp; &#46321;&#47197;&#54616;&#50668; &amp;nbsp;&#49324;&#50857; &#54624; &#49688; &#51080;&#44172; &#44396;&#54788;&#54633;&#45768;&#45796;. (Chain of responsibility)&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;&amp;lt;bean id="sviewBeanNameViewResolver" class="sview.SViewBeanNameViewResolver"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="order" value="1" /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="prettyPrint" value="true" /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="sviewFactoryBeanName" value="sviewSpringBeanFactory" /&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;bean id="sviewSpringBeanFactory" class="sview.SViewSpringBeanFactory"&amp;gt;&amp;lt;/bean&amp;gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;lt;bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="viewClass"&amp;gt;&amp;lt;value&amp;gt;org.springframework.web.servlet.view.JstlView&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="prefix"&amp;gt;&amp;lt;value&amp;gt;/WEB-INF/views/&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="suffix"&amp;gt;&amp;lt;value&amp;gt;.jsp&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ViewResolver&#51032; &#44396;&#54788;&#49345;&#49549;&#51012; &#54616;&#47140;&#47732;&amp;nbsp; View resolveViewName(String viewName,Locale locale)&#51060;&#46972;&#45716; &#47700;&#49548;&#46300;&#47484; &#44396;&#54788;&#54644;&#50556; &#54633;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;&#51593; &#51204;&#45804;&#48155;&#51008; ViewName&#51004;&#47196; View&#51012; &#44208;&#51221;&#54644; &#45804;&#46972;&#45716; &#48512;&#48516;&#51060;&#46972;&#44256; &#54624;&#49688; &#51080;&#49845;&#45768;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;public class SViewBeanNameViewResolver extends WebApplicationObjectSupport implements ViewResolver,Ordered {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; private final static String DELIMITER = "sview:";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; private int order = Integer.MAX_VALUE;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; private String sviewFactoryBeanName = "sviewSpringBeanFactory";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; private boolean isPrettyPrint = true;&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setOrder(int order) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.order = order;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public int getOrder() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return order;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setSviewFactoryBeanName(String sviewFactoryBeanName) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.sviewFactoryBeanName = sviewFactoryBeanName;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setPrettyPrint(boolean isPrettyPrint) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.isPrettyPrint = isPrettyPrint;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public View resolveViewName(String viewName,Locale locale) throws Exception {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(viewName.indexOf(DELIMITER) &amp;lt; 0) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String sviewName = viewName.substring(viewName.indexOf(DELIMITER)+6);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebApplicationContext ctx = super.getWebApplicationContext();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SViewFactory sviewFactory = (SViewFactory) ctx.getBean(this.sviewFactoryBeanName);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewAdapter view = new ViewAdapter();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; view.setSViewName(sviewName);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; view.setSViewFactory(sviewFactory);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; view.setPrettyPrint(isPrettyPrint);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return view;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
}&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&#50948;&#51032; &#53076;&#46300;&#45716; ViewResolver&#51032; &#44396;&#54788;&#53364;&#47000;&#49828;&#51004;&#47196;, viewName&#51473; DELIMITER&#51004;&#47196; &#49884;&#51089;&#46104;&#45716; viewName&#51064;&#51648;&#47484; &#44160;&#52636;&#54616;&#44256;, &#49828;&#54532;&#47553; &#52968;&#53581;&#49828;&#53944;&#50640;&#49436; &#54644;&#45817; &#51060;&#47492;&#51004;&#47196; &#46321;&#47197;&#46108; sviewFactory&#51012; &#50619;&#50612; &#50741;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;ViewAdapter &#45716; View &#51064;&#53552;&#54168;&#51060;&#49828;&#51032; &#44396;&#54788;&#53364;&#47000;&#49828;&#51060;&#44256; &#51204;&#45804;&#48155;&#51008; sviewFactory&#51012; &#44032;&#51648;&#44256; &#54644;&#45817; sview&#51012; &#50619;&#50612;&#49436;, &#47004;&#45908;&#47553;&#54616;&#45716;(sviewRenderer)&#54616;&#45716; &#52293;&#51076;&#51060; &#51080;&#49845;&#45768;&#45796;.&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Scala&#51032; XML Processing&lt;/h4&gt;
&lt;p&gt;Scala&#51032; XML Processing&#51008; xml&#51012; &#47928;&#48277; &#49888;&#53469;&#49828;&#52376;&#47100; &#49324;&#50857;&#54624;&#49688; &#51080;&#49845;&#45768;&#45796;. &#53945;&#55176; xml&#51012; &#53076;&#46300;&#49345;&#50640; &#51089;&#49457;&#54616;&#47732; scala &#52980;&#54028;&#51068;&#47084;&#44032; xml &#49888;&#53469;&#49828;&#47484; scala.xml&#50640; &#51080;&#45716; &#44061;&#52404;&#47196; &#44368;&#52404;&#54644;&#51469;&#45768;&#45796;. &#51221;&#54869;&#54620; &#48708;&#44368;&#45716; &#50500;&#45768;&#51648;&#47564;, &#50864;&#47532;&#44032; &#47928;&#51088;&#50676;&#51012; &#48320;&#49688;&#50640; &#54624;&#45817; &#54624;&#46412;, String s = "hello" &#44284; String s = new String("hello")&#50752; &#44057;&#51008; &#44163; &#52376;&#47100;, scala&#50640;&#49436;&#45716; val xml =&amp;lt;xml&amp;gt;hello&amp;lt;/xml&amp;gt;&#51060; val xml = Elem(null, "xml", Null, TopScope,Text("hello"))&#50752; &#44057;&#49845;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;&#53945;&#55176; &#45236;&#51109;&#46108; &#54364;&#54788;(embedded expresions)&#51012; &#49324;&#50857;&#54616;&#47732;&amp;nbsp; &#48324;&#46020;&#51032; &#53596;&#54540;&#47551; &#50644;&#51652;&#51012; &#49324;&#50857;&#54616;&#51648; &#50506;&#50500;&#46020; &#46112; &#51221;&#46020;&#47196; XQuery&#51012; &#49324;&#50857;&#54616;&#45716; &#46319;&#54620; xml &#52376;&#47532;&#44032;&amp;nbsp; &#50857;&#51060;&#54644; &#51656;&#49688; &#51080;&#49845;&#45768;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;&amp;nbsp;val date = &amp;lt;date&amp;gt;{ df.format(new java.util.Date()) }&amp;lt;/date&amp;gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Console.println(date)&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Hello World&lt;/h4&gt;
&lt;p&gt;sview&#51012; &#51060;&#50857;&#54620; Hello World&#51012; &#52636;&#47141;&#54616;&#45716; &#44036;&#45800;&#54620; &#54532;&#47196;&#44536;&#47016;&#51012; &#47564;&#46308;&#50612; &#48372;&#44192;&#49845;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;Spring2.5 &#51032; AnnotationBased Controller&#50752; DI&#51012; &#49324;&#50857;&#54633;&#45768;&#45796;. &#50864;&#49440; SpringMVC&#51032; View,ViewResolver&#50640; &#45208;&#50724;&#45716; &#49444;&#51221;&#51012; springmvc-context.xml&#50640; &#54633;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;&#44536;&#47532;&#44256; MVC&#51032; Controller&#44284; View&#51012; &#51089;&#49457;&#54633;&#45768;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;@Controller&lt;br /&gt;
public class IndexController&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; @RequestMapping("/index.sview")&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public String indexScala(ModelMap models) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Model model = new Model();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; model.setName("HELLO WORLD");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; models.addAttribute("model",model);&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return "sview:index:sampleLayout";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;IndexController.java&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;@Component&lt;br /&gt;
@Scope("prototype")&lt;br /&gt;
class Index(b:ViewBinding) extends SViewContent(b){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; def head()&amp;nbsp; = {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt; this is index &amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; def content() = {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; val m : Model = b.getModels.get("model").asInstanceOf[Model]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; val df : java.text.DateFormat = java.text.DateFormat.getDateInstance()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;html&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;head&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { head }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;body&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt; this is index List ! &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt; { m.getName } &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt; today is { df.format(new java.util.Date()) } &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;index.scala&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;IndexController&#51032; indexScala&#50640;&#49436; &#47532;&#53556;&#54616;&#45716;&amp;nbsp; viewName&#51060; "sview:index:sampleLayout"&#51077;&#45768;&#45796;. &#50526;&#51032; prefix&#45716; sviewResolver&#50640;&#49436; &#44160;&#52636;&#54616;&#45716; &#50857;&#46020;&#47196; &#50416;&#51060;&#44256;, index:sampleLayout&#51008; &#44033;&#44033;&amp;nbsp; SView&#51032; &#51060;&#47492;&#51077;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;sampleLayout.scala&#45716; SiteMesh&#52376;&#47100;&amp;nbsp; index&#51032; html&#51032; head&#50752; body&#51012; &#51088;&#49888;&#51032; head&#50752; body&#51004;&#47196; &#52628;&#44032;&#54616;&#50668; &#52636;&#47141;&#54616;&#44172; &#46121;&#45768;&#45796;. &#44036;&#45800;&#54620; &#47112;&#51060;&#50500;&#50883; &#44592;&#45733;&#51060;&#46972;&#44256; &#54624;&#49688; &#51080;&#49845;&#45768;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;@Component&lt;br /&gt;
@Scope("prototype")&lt;br /&gt;
class SampleLayout(b:ViewBinding,v:SView) extends SViewComposite(b,v) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; def content() = {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;lt;html&amp;gt;&lt;/li&gt;
&lt;li&gt;
&lt;p style="margin-left: 4em;"&gt;&amp;nbsp; &amp;lt;head&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style="margin-left: 4em;"&gt;&amp;nbsp; {&amp;nbsp; v.content \\ "head" \\ "_" }&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style="margin-left: 4em;"&gt;&amp;nbsp; &amp;lt;/head&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style="margin-left: 4em;"&gt;&amp;nbsp; &amp;lt;body&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style="margin-left: 4em;"&gt;&amp;nbsp; { v.content \\ "body" \\ "_" }&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style="margin-left: 4em;"&gt;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style="margin-left: 4em;"&gt;&amp;nbsp; &amp;lt;/html&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&amp;nbsp; &amp;nbsp; }&lt;/li&gt;
&lt;li&gt;}&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;sampleLayout.scala&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img title="&#44536;&#47548;_3.png" class="attachment" src="/pages/1574342/attachments/688366" alt="&#44536;&#47548;_3.png" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&#45824;&#47029;&#51201;&#51064; &#44396;&#49457; &#50836;&#49548;&lt;/h4&gt;
&lt;p&gt;&lt;img class="attachment" title="sview-pattern-dia.jpg" src="/pages/1574342/attachments/688268" alt="sview-pattern-dia.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;SView&amp;nbsp;&lt;/h5&gt;
&lt;p&gt;SView&#45716;&amp;nbsp; Scala&#51032; trait&#51077;&#45768;&#45796;. &#51088;&#48148;&#51032; Interface&#50640; &#54644;&#45817;&#54633;&#45768;&#45796;. SView&#50640;&#45716; &#45796;&#51020;&#44284; &#44057;&#51008; &#47700;&#49548;&#46300;&#44032; &#51080;&#49845;&#45768;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;trait SView&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; def doctype() : String&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; def contenttype() : String&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; def content() : Elem&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; def render(render : SViewRenderer) : Unit&lt;br /&gt;
}&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;SView&#51008; View&#50640;&#49436; &#54596;&#50836;&#54620; &#54665;&#46041;&#51012; &#51221;&#51032;&#54633;&#45768;&#45796;. &#51060;&#51473; &#44592;&#48376;&#51201;&#51064; &#51221;&#48372;&#47484; &#51648;&#50896;&#54624;&#49688; &#51080;&#45716; &#44163;&#51008;&amp;nbsp; &#44396;&#54788; &#49345;&#49549;&#51004;&#47196; &#51228;&#44277;&#54616;&#44172; &#46121;&#45768;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;abstract class AbstractSView extends SView {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; def contenttype() : String = {"text/html"}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; def doctype() : String = {""}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; def render(render : SViewRenderer) : Unit = {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; render.setContentType(contenttype())&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; render.setDocType(doctype())&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; render.setContent(content())&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;SView,SViewContent,ViewComposite : Composite , case classes&lt;/h5&gt;
&lt;p&gt;SView,AbstractSView&#51012; &#49345;&#49549;&#48155;&#45716; &#53364;&#47000;&#49828;&#50640;&#45716; SViewContent&#50752; SViewComposite&#44032; &#51080;&#49845;&#45768;&#45796;. &#51060; &#46160; &#53364;&#47000;&#49828;&#45716; Scala&#51032; &#52992;&#51060;&#49828; &#53364;&#47000;&#49828;&#51077;&#45768;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;abstract case class SViewContent(binding : ViewBinding) extends AbstractSView {}&lt;br /&gt;
abstract case class SViewComposite(binding : ViewBinding , view : SView) extends AbstractSView {}&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&#50612;&#46500; &#54056;&#53556;&#47588;&#52845;&#51012; &#54616;&#44592; &#50948;&#54644;&#49436; case class&#51004;&#47196; &#47564;&#46304; &#44148; &#50500;&#45768;&#50632;&#49845;&#45768;&#45796;.(&#52376;&#51020;&#50640;&#45716; &#54056;&#53556; &#47588;&#52845;&#51004;&#47196; Render&#51032; &#52293;&#51076;&#51012; &#45796;&#47476;&#44172; &#44396;&#49457;&#54616;&#47140;&#44256;&amp;nbsp; &#44536;&#47020;&#49845;&#45768;&#45796;.)&lt;/p&gt;
&lt;p&gt;&#52992;&#51060;&#49828; &#53364;&#47000;&#49828;&#45716; &#44061;&#52404; &#53440;&#51077;&#51012; &#54056;&#53556;&#51004;&#47196; &#48516;&#54644;(decomposition)&#54616;&#44592; &#46412;&#47928;&#50640; erlang&#51032; &#50528;&#47532;&#54000;(arity)&#52376;&#47100; &#54056;&#53556; &#47588;&#52845;&#50640; &#47588;&#52845;&#48320;&#49688;&#47196; &#50416;&#51077;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;&#44536;&#47000;&#49436; &#54616;&#50948; &#44396;&#54788; &#53364;&#47000;&#49828;&#46308;&#51032; &#49373;&#49457;&#51088;&#50640; &#45824;&#54620; &#51228;&#54620;&#51012; &#51460;&#49688; &#51080;&#45716; &#51109;&#51216;&#51012; &#51060;&#50857;&#54664;&#49845;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;SViewComposite&#45716; &#50948;&#51032; &#47112;&#51060;&#50500;&#50883;&#52376;&#47100; &#46608; &#45796;&#47480; SView&#51012; &#51064;&#51088;&#47196; &#50619;&#50612;&#49436; &#51088;&#44592; &#51088;&#49888;&#51032; content&#50640; &#52628;&#44032; &#54624;&#49688; &#51080;&#49845;&#45768;&#45796;. &#51593; &#44277;&#53685;&#51201;&#51064;&amp;nbsp; SView&#51012; &#49324;&#50857;&#54616;&#44592;&#46412;&#47928;&#50640; &#51204;&#52404;/&#48512;&#48516;&#51060;&#46972;&#45716; &#44396;&#51312;&#47484; &#49789;&#44172; &#44396;&#49457;&#54624;&#49688; &#51080;&#49845;&#45768;&#45796;.(Compositie&#54056;&#53556;) Client&#44032; &#48372;&#44592;&#50640; Decorator&#54056;&#53556;&#52376;&#47100; &#54616;&#45208;&#51032; &#51064;&#53552;&#54168;&#51060;&#49828;&#51012; &#44032;&#51648;&#44256; &#45796;&#47480; &#44592;&#45733;&#51012; &#54616;&#45716; &#44163; &#52376;&#47100;, &#54252;&#54632;&#48155;&#51008; SView&#51032; &#45236;&#50857;&#51012; &#51088;&#44592; &#51088;&#49888;&#51032; content&#50640; &#52628;&#44032;&#54616;&#44592; &#46412;&#47928;&#50640; Decorator&#54056;&#53556;&#51032; &#49892;&#52404;&#54868;&#46972;&#44256;&#46020; &#49373;&#44033;&#54633;&#45768;&#45796;.&lt;/p&gt;
&lt;h5&gt;SViewFactory,SViewSpringBeanFactory : AbstractFactory , ConcreteFactory&lt;/h5&gt;
&lt;p&gt;&amp;nbsp;SViewFactory&#45716; SView&#51012; &#49373;&#49457;&#54616;&#45716; &#52293;&#51076;&#51060; &#51080;&#49845;&#45768;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;public interface SViewFactory {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; public SView getSView(String viewName,ViewBinding viewBinding);&lt;br /&gt;
}&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&#50668;&#44592;&#49436; ViewBinding&#51008; &#44396;&#54788;&#54056;&#53556;&#50640;&#49436; &#51060;&#50556;&#44592;&#54616;&#45716; &#54028;&#46972;&#48120;&#53552; &#44061;&#52404;&#51077;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;&#50896;&#47000; View &#51064;&#53552;&#54168;&#51060;&#49828;&#45716; HttpServletRequest,HttpServletResponse&#50752; Model&#51012; &#51064;&#51088;&#47196; &#48155;&#45716; &#47700;&#49548;&#46300;&#44032; &#51080;&#49845;&#45768;&#45796;. ViewBinding&#51008; &#51060; &#51064;&#49688;&#47484; &#54028;&#46972;&#48120;&#53552;&#44061;&#52404;&#47196; &#54633;&#49457;&#54633;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;SViewSpringBeanFactory&#51008; SViewFactory&#51032; &#51064;&#53552;&#54168;&#51060;&#49828; &#49345;&#49549;&#51012; &#54616;&#50668; SpringBeanContext&#50640;&#49436;&amp;nbsp;viewName&#51004;&#47196; SView&#51012; &#50619;&#50612;&#50741;&#45768;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;public class SViewSpringBeanFactory extends WebApplicationObjectSupport implements SViewFactory {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; private final String DEFAULT_VIEW_DELIMITER= ":";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public SView getSView(String viewName,ViewBinding viewBinding) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String[] str = viewName.split(DEFAULT_VIEW_DELIMITER);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String sviewName = null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String scompositeViewName = null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(str.length &amp;gt;= 1 &amp;amp;&amp;amp; StringUtils.hasText(str[0])) sviewName = str[0];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(str.length &amp;gt;= 2 &amp;amp;&amp;amp; StringUtils.hasText(str[1])) scompositeViewName = str[1];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebApplicationContext ctx = super.getWebApplicationContext();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SView sview = (SView) ctx.getBean(sviewName,new Object[]{viewBinding});&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(StringUtils.hasText(scompositeViewName)) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SView sviewcomposite = (SView) ctx.getBean(scompositeViewName,&lt;/li&gt;
&lt;li&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new Object[]{viewBinding,sview});&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return sviewcomposite;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return sview;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;ViewAdapter : Adapter&lt;/h5&gt;
&lt;p&gt;SView&#51012; &#49345;&#49549;&#54620; &#44061;&#52404;&#46308;&#51008; &#51060;&#48120; &#49345;&#49549;&#54664;&#51004;&#48064;&#47196; View &#51064;&#53552;&#54168;&#51060;&#49828;&#47484; &#49345;&#49549;&#54616;&#51648; &#50506;&#45716; &#54620; ViewResolver&#50640; &#52628;&#44032;&#54624;&#49688; &#50630;&#49845;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;&#47932;&#47200; SView&#44032; View&#51012; extends&#54644;&#46020; &#46104;&#51648;&#47564;. ViewAdapter&#51012; &#49324;&#50857;&#54632;&#51004;&#47196;&#50024;, &#44592;&#51316;&#51032; &#53364;&#47000;&#49828;(SView)&#50640; &#45824;&#54620; &#48320;&#44221;&#51012; &#54616;&#51648; &#50506;&#44256;,&amp;nbsp;&#51204;&#54784; &#45796;&#47480; &#53440;&#51077;&#51032; &#53364;&#47000;&#49828;(View)&#52376;&#47100; &#49324;&#50857;&#54624;&#49688; &#51080;&#49845;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;&#53945;&#55176; &#51060;&#48512;&#48516;&#51008; &#49828;&#54532;&#47553; &#54532;&#47112;&#51076;&#50892;&#53356;&#51032; View Interface&#51032; render&#51032; Map model&#51060; &#51228;&#45320;&#47533; &#53440;&#51077; &#54028;&#46972;&#48120;&#53552;&#44032; &#46104;&#50612; &#50506;&#50500;&#49436;, Scala&#50640;&#49436; &#51064;&#53552;&#54168;&#51060;&#49828; &#49345;&#49549;&#51012; &#54616;&#51648; &#47803;&#54644;,&amp;nbsp;&#51204;&#54784; &#45796;&#47480; &#53440;&#51077;&#51064; View&#51064;&#52377;&#54616;&#45716; &#44061;&#52404;&#51077;&#45768;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;public class ViewAdapter implements View {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; private final static String DEFAULT_CONTENT_TYPE = "text/html";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; private String sviewName;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; private SViewFactory sviewFactory;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; private boolean isPrettyPrint = true;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; private String contentType;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public ViewAdapter() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setSViewName(String sviewName) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.sviewName = sviewName;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setSViewFactory(SViewFactory sviewFactory) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.sviewFactory = sviewFactory;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setPrettyPrint(boolean isPrettyPrint) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.isPrettyPrint = isPrettyPrint;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getContentType() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return contentType;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void render(Map model, HttpServletRequest request,HttpServletResponse response)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;throws Exception {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewBinding viewBinding = new ViewBinding((Map&amp;lt;String,Object&amp;gt;) model,request,response);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SView sview = sviewFactory.getSView(sviewName,viewBinding);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.contentType = sview.contenttype();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SViewWriteRenderer renderer = new SViewWriteRenderer();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sview.render(renderer);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.setContentType(this.contentType);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PrintWriter out = response.getWriter();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; renderer.print(out,isPrettyPrint);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.close();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h5&gt;SViewRenderer , SViewWriteRenderer : Abstract Builder, Concrete Builder&lt;/h5&gt;
&lt;p&gt;&#44277;&#53685;&#51201;&#51064; &#50672;&#49328;&#51012; &#51221;&#51032;&#54620; AbstractSView&#51032; build()&#51032; &#54028;&#46972;&#48120;&#53552;&#47196; &#51204;&#45804;&#46104;&#45716; SViewRenderer&#45716; &#52636;&#47141;&#50640; &#54596;&#50836;&#54620; &#51221;&#48372;&#50640; &#45824;&#54620; &#47700;&#49548;&#46300;&#47564;&#51012; &#44032;&#51648;&#44256; &#51080;&#49845;&#45768;&#45796;. &#51593; Director&#51064; SView&#45716; Renderer&#44032; &#50612;&#46523;&#44172; &#54364;&#54788;&#54624;&#51648;&#50640; &#45824;&#54616;&#50668; &#50508;&#51648; &#47803;&#54633;&#45768;&#45796;.&amp;nbsp; SViewRenderer&#51032; &#44396;&#52404; &#53364;&#47000;&#49828;&#51064; SViewWriteRenderer&#45716; HttpServletResponse&#50640;&#49436; &#51204;&#45804; &#48155;&#45716; PrintWriter&#51012; &#51060;&#50857;&#54644;&#49436; &#54364;&#54788;&#54633;&#45768;&#45796;. &#47564;&#51068; &lt;code&gt;ServletOutputStream&lt;/code&gt;&#51060;&#45208; &#44592;&#53440; &#45796;&#47480; &#48169;&#49885;&#51004;&#47196;&#51032; &#54364;&#54788;&#51012; &#48148;&#44984;&#45908;&#46972;&#46020; &#48320;&#54868;&#45716; ViewAdpater&#50640;&#49436; &#45796;&#47480; &#48169;&#49885;&#51032; &#54364;&#54788;&#51012; &#54616;&#45716; Renderer&#51004;&#47196; &#44368;&#52404;&#47196; &#44397;&#54620;&#46121;&#45768;&#45796;.&lt;/p&gt;
&lt;ol class="code"&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;trait SViewRenderer {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; def setDocType(docType : String)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; def setContentType(contentType : String)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; def setContent(content : Elem)&lt;br /&gt;
}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;public class SViewWriteRenderer implements SViewRenderer {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; private String docType = "";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; private String contentType = "";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; private Elem content = null;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setDocType(String docType) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.docType = docType;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getContentType() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return this.contentType;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setContentType(String contentType) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.contentType = contentType;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setContent(Elem content) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.content = content;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void print(PrintWriter writer,boolean isprettyprint) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String result = null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(isprettyprint == true) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PrettyPrinter pp = new PrettyPrinter(120,4);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = pp.format(content);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = content.toString();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writer.print(docType);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writer.print(result);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&#47610;&#45716; &#47568;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&#51089;&#49457;&#54616;&#44256; &#45208;&#49436; &#54841;&#49884; &#51060;&#50752; &#48708;&#49847;&#54620; &#49373;&#44033;&#51012; &#54620; &#49324;&#46988;&#51060; &#51080;&#45716;&#51648; &#50508;&#50500;&#48372;&#45768;&#44620;&amp;nbsp; Object-Oriented Pattern Matching &#45436;&#47928;&#51012; &#51089;&#49457;&#54620; burak emir &#51032;&amp;nbsp; scalaservlet &#51060; &#51080;&#50632;&#49845;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://burak.emir.googlepages.com/"&gt;http://burak.emir.googlepages.com&lt;/a&gt; &lt;a href="http://burak.emir.googlepages.com/scalaservlet.html"&gt;http://burak.emir.googlepages.com/scalaservlet.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&#44536;&#47532;&#44256; scala&#51032; &#50937; &#54532;&#47112;&#51076;&#50892;&#53356;&#51064; lift&#51032; SHtml&#50640;&#49436;&#46020; &#45796;&#51020;&#44284; &#44057;&#51060; &#49324;&#50857;&#54633;&#45768;&#45796;.&amp;nbsp; &lt;a href="http://github.com/dpp/liftweb/tree/master/lift/src/main/scala/net/liftweb/http/SHtml.scala"&gt;http://github.com/dpp/liftweb/tree/master/lift/src/main/scala/net/liftweb/http/SHtml.scala&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;XML/HTML&#51032; &#44033; &#45432;&#46300;&#47560;&#45796; &#44061;&#52404;&#47484; &#49373;&#49457;&#54616;&#44592; &#46412;&#47928;&#50640; &#51068;&#48152;&#51201;&#51064; JSP&#48372;&#45796; &#48708;&#50857; &#48156;&#49373;&#51060; &#47566;&#51008; &#46319; &#54633;&#45768;&#45796;. &#49892;&#51228; &#54596;&#46300;&#50640;&#49436; &#51201;&#50857;&#54616;&#47140;&#47732;, &#52880;&#49772;&#51204;&#47029;&#51060;&#46972;&#46304;&#44032; Scala&#51032; XML Processing&#47568;&#44256; &amp;nbsp; &#45796;&#47480; DSL&#51060;&#45208; Template &#50644;&#51652;&#51012; &#44396;&#49457;&#54624; &#54596;&#50836;&#46020; &#51080;&#45796;&#44256; &#49373;&#44033;&#54633;&#45768;&#45796;. SViewSpringBeanFactory&#50640;&#49436; sviewName&#50640; &#54644;&#45817;&#54616;&#45716; SView &#44061;&#52404;&#47484; &#50619;&#51648; &#47803;&#54664;&#51012; &#44221;&#50864;&#50640; &#51328;&#45908; &#47749;&#54869;&#54620; Exception(SViewNotFoundException &#46321;&#46321;)&#51012; &#48156;&#49373;&#54620;&#45796;&#45912;&#44032; &#54616;&#45716; &#48512;&#48516;&#44284; &#49457;&#45733;&#50640; &#45824;&#54620; &#48512;&#48516;&#51008; &#45796;&#49884; &#54620;&#48264; &#44256;&#47140;&#54644;&#48380;&#47564; &#54616;&#45796;&#44256; &#49373;&#44033;&#54633;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;&#52376;&#51020; &#49373;&#44033;&#51008; &#51088;&#48148;&#50640;&#49436;&#51032;&amp;nbsp; &#46041;&#51201; &#49828;&#53356;&#47549;&#53944; &#50616;&#50612;&#51032; &#54952;&#44284;&#51201;&#51064; &#49324;&#50857;&#50640; &#51201;&#54633;&#54620; &#47112;&#51060;&#50612;&#44032; View&#44032; &#50500;&#45776;&#44620;&#54644;&#49436; View&#50640; &#45824;&#54620; &#44032;&#48333;&#44256; &#49772;&#50868; &#50616;&#50612;&#47484; &#52286;&#45796;&#44032; &#50668;&#44592;&#44620;&#51648; &#50772;&#49845;&#45768;&#45796;. :-) &#50937; &#54532;&#47196;&#44536;&#47000;&#48141;&#50640;&#49436; &#53945;&#55176; &#51088;&#48148; &#50937; &#54532;&#47196;&#44536;&#47000;&#48141;&#50640;&#49436; Html&#44284; &#45936;&#51060;&#53552;&#47484; &#48148;&#51064;&#46377; &#54616;&#45716; &#48169;&#48277;&#51008; &#47566;&#51648;&#47564;. &#54952;&#44284;&#51201;&#51004;&#47196;&amp;nbsp; &#44288;&#47532; &#44032;&#45733;&#54620; (&#53945;&#55176; &#53580;&#49828;&#53944; &#44032;&#45733;&#54620;) &#48624; &#44592;&#49696;&#51008; &#47566;&#51648; &#50506;&#50500; &#48372;&#51077;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;&#51648;&#44552;&#44620;&#51648; &#51069;&#50612; &#51452;&#49492;&#49436; &#44048;&#49324;&#54633;&#45768;&#45796;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&#52280;&#44256;&#51088;&#47308;&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/web/servlet/View.html"&gt;http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/web/servlet/View.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/web/servlet/ViewResolver.html"&gt;http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/web/servlet/ViewResolver.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.scala-lang.org/intro/xml.html"&gt;http://www.scala-lang.org/intro/xml.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://burak.emir.googlepages.com/scalaxbook.docbk.html"&gt;http://burak.emir.googlepages.com/scalaxbook.docbk.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</source>
  <rights nil="true"></rights>
  <creator>http://anarch.myid.net/</creator>
  <contributor_modified>http://anarch.myid.net/</contributor_modified>
  <version type="integer">316</version>
  <tags></tags>
</page>
