a crash course on servlets -...
TRANSCRIPT
![Page 1: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/1.jpg)
A crash course on Servlets
![Page 2: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/2.jpg)
ServletsServlets are modules that extend Java-enabled web servers. For example, a
servlet might be responsible for taking data in an HTML order-entry formand applying the business logic used to update a company's orderdatabase.
![Page 3: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/3.jpg)
A Servlet's job
![Page 4: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/4.jpg)
Servlet Lifecycle
init()
destroy()
service(HttpServletRequest r,HttpServletResponse p)
Called only the first time a servlet isloaded into memory!
doGet()
doPost()
doXXX()
Used only when memory is freed
If the Servlet implements SingleThreadModelthere will be no mutithreading
![Page 5: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/5.jpg)
Get vs Post
What are "Get" and "Post"?
Get and Post are methods used to send data to the server:With the Get method, the browser appends the data onto the URL.With the Post method, the data is sent as "standard input.“
Why Do I Care?
It's important for you to know which method you are using. TheGet method is the default, so if you do not specify a method, theGet method will be used automatically.
The Get method has several disadvantages:
There is a limit on the number of characters which can be sent tothe server, generally around 100 - 150 characters.
Your user will see the "messy codes" when the data is sent.
![Page 6: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/6.jpg)
service()
This code is part of the class HttpServlet protected void service (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod (); if (method.equals ("GET")) { long ifModifiedSince; long lastModified; long now; ifModifiedSince = req.getDateHeader ("If-Modified-Since"); lastModified = getLastModified (req); maybeSetLastModified (resp, lastModified); if (ifModifiedSince == -1 || lastModified == -1) doGet (req, resp); else { now = System.currentTimeMillis (); if (now < ifModifiedSince || ifModifiedSince < lastModified) doGet (req, resp); else resp.sendError (HttpServletResponse.SC_NOT_MODIFIED); }
![Page 7: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/7.jpg)
service()
This code is part of the class HttpServlet protected void service (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod (); if (method.equals ("GET")) { long ifModifiedSince; long lastModified; long now; ifModifiedSince = req.getDateHeader ("If-Modified-Since"); lastModified = getLastModified (req); maybeSetLastModified (resp, lastModified); if (ifModifiedSince == -1 || lastModified == -1) doGet (req, resp); else { now = System.currentTimeMillis (); if (now < ifModifiedSince || ifModifiedSince < lastModified) doGet (req, resp); else resp.sendError (HttpServletResponse.SC_NOT_MODIFIED); }
![Page 8: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/8.jpg)
service() } else if (method.equals ("HEAD")) { long lastModified; lastModified = getLastModified (req); maybeSetLastModified (resp, lastModified); doHead (req, resp); } else if (method.equals ("POST")) { doPost (req, resp); } else if (method.equals ("PUT")) { doPut(req, resp); } else if (method.equals ("DELETE")) { doDelete(req, resp); } else if (method.equals ("OPTIONS")) { doOptions(req,resp); } else if (method.equals ("TRACE")) { doTrace(req,resp); } else { resp.sendError (HttpServletResponse.SC_NOT_IMPLEMENTED,
"Method '" + method + "' is not defined in RFC 2068"); }
}
![Page 9: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/9.jpg)
A taste of servlet programming
![Page 10: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/10.jpg)
Handling doPostpublic void doPost (HttpServletRequest rq,
HttpServletResponse rp)throws ServletException,IOException
{doGet(rq,rp);
}
![Page 11: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/11.jpg)
Configuring with web.xml
![Page 12: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/12.jpg)
WebApps(Tomcat configuration)
![Page 13: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/13.jpg)
Static pages
To let Tomcat serve static pages, we must define a “WebApplication”.That is, in the Tomcat Document Root (by default$CATALINA_HOME/webapps/) we must create a folder namedafter our Web Application (e.g. myApp).
In that “myApp” folder, we MUST create a WEB-INF folder(that can be empy).
In the myApp folder we can then depost the static html files.On our Tomcat server, the URL for the hello.html file becomes:http://machine/port/myApp/hello.html
To actually see the webapp, we might have to restart Tomcat
myApp
hello.htmlWEB-INF
webapps
web.xml
![Page 14: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/14.jpg)
Static pages
A web.xml file MUST be provided:<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application2.3//EN“ "http://java.sun.com/dtd/web-app_2_3.dtd"><web-app></web-app>
myApp
hello.htmlWEB-INF
webapps
web.xml
![Page 15: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/15.jpg)
ServletsTo let Tomcat serve servlet, we need add some info. The compiled servlets (.class) mustbe stored in a “classes” directory in WEB-INF.Moreover, the web.xml file MUST contain at least:<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"><web-app> <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/magic/*</url-pattern> </servlet-mapping></web-app>The “magic” word is the servlet activation keyword (you can of course customize this word).To execute the servlet called MyServlet.class, the URL will be:http://machine/port/myApp/magic/MyServlet
![Page 16: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/16.jpg)
ServletsThe web.xml file CAN contain many additional info.For instance, it can contain a section defining an aliasname for the servlet:… <servlet> <servlet-name>pippo</servlet-name> <servlet-class>Servlet1</servlet-class> </servlet>…In such case, the servlet called MyServlet.classCan be activated ALSO by the URL:http://machine/port/myApp/magic/pippo
myApp
web.xml
WEB-INF
webapps
classes
MyServlet.class
![Page 17: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/17.jpg)
Forms (a quick overview)
See also: http://www.cs.tut.fi/~jkorpela/forms/
![Page 18: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/18.jpg)
FormsGive to the user the possibility to di send information to the Web server
The FORM tag defines a form and has the following attributes:•ACTION identifies the processing engine •ENCTYPE specificies the MIME type used to pass data to the server (Es. Text/html)
FORM contains the sub-tag:•several tags for collecting data•An INPUT tag must be of type SUBMIT for sending the data•An INPUT can be of tye RESET to cancel all the gathered data
![Page 19: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/19.jpg)
Form - input
<FORM method="POST" action="/cgi-bin/elabora"> Scrivi il tuo nome <Input type="text" size“=25" maxlength="15“ name=“a”> <Input type="submit" value="spedisci"> <Input type="reset" value="annulla"></FORM>
Sends a url of type http://…/cgi-bin/elabora?a=MarcoRonchetti&b=…
![Page 20: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/20.jpg)
Reading parameters
![Page 21: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/21.jpg)
ExamplesFor examples, see
http://courses.coreservlets.com/Course-Materials/pdf/csajsp2/03-Form-Data.pdf
![Page 22: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/22.jpg)
Check for missing or wrong parameters!1. Do not assume user will give the expected
data2. Do not show the user Java error messages!
p Use default valuesp Redisplay the form
![Page 23: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/23.jpg)
Tags for font aestetics
![Page 24: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/24.jpg)
Tags for font aestetics
![Page 25: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/25.jpg)
HTTP Header & Status code
![Page 26: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/26.jpg)
Request and response
![Page 27: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/27.jpg)
HTTP Header
![Page 28: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/28.jpg)
Reading HTTP header
![Page 29: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/29.jpg)
Resist!
Resist the temptation to adapt your page to theuser's agent (i.e. the browser!)
Remember: headers can be faked!
![Page 30: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/30.jpg)
ExampleSeehttp://courses.coreservlets.com/Course-
Materials/pdf/csajsp2/04-Request-Headers.pdf
For an example of a choice based on the HTTPheader (wheater to send compressed oruncompressed data)
![Page 31: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/31.jpg)
Common status codes
![Page 32: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/32.jpg)
Common status codes
![Page 33: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/33.jpg)
How to set the status code
![Page 34: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/34.jpg)
Setting the response header
![Page 35: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/35.jpg)
Mimetypes
![Page 36: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/36.jpg)
MimetypesSee examples inhttp://courses.coreservlets.com/Course-
Materials/pdf/csajsp2/06-Response-Headers.pdf
- How to generate an excel sheet- How to generate a jpeg on the flight
![Page 37: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/37.jpg)
Cookies
![Page 38: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/38.jpg)
Writing cookies
![Page 39: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/39.jpg)
Reading cookies
![Page 40: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/40.jpg)
Setting cookie properties
![Page 41: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/41.jpg)
setAgesetAge(x); x>0 set Time To Live (in sec)
setAge(0); tell the browser to delete the cookie
setAge(-1); use a session cookie
![Page 42: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/42.jpg)
Replace a cookie value
![Page 43: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/43.jpg)
Sessions
![Page 44: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/44.jpg)
Home-made sessions
![Page 45: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/45.jpg)
Java HttpSessions
![Page 46: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/46.jpg)
Using sessions (with cookies)
![Page 47: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/47.jpg)
Session methods
![Page 48: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/48.jpg)
Session methods
![Page 49: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/49.jpg)
Session methods
![Page 50: A crash course on Servlets - UniTrentolatemar.science.unitn.it/segue_userFiles/2010WebArchitectures/Servl… · Servlets Servlets are modules that extend Java-enabled web servers](https://reader034.vdocuments.site/reader034/viewer/2022042812/5fa952ffe8b8bc7c31674a43/html5/thumbnails/50.jpg)
Using sessions (with URL rewriting)