Udemy course 2017, by Matt Greecroft, 20220201-0219
文章目录
- Prepare the environment
- Servlets
- GET, POST and Redirect
- Servlet Security, Annotation and Filter
- Java Server Pages (JSP)
- Java Standard Tag Libruary (JSTL)
- AJAX (Asynchronous JavaScript And XML)
- Asynchronous Servlets
- Web Socket
Prepare the environment
Export WAR file
eclipse IDE - Help - Install New Software - Work with “All Available Sites” - Web, XML, … - choose Java EE Dev. Tools, Java Web Dev. Tools and JST Server Adapters extension.
Project - Export - WAR file
Open Project
copy the start working directory to workspace.
New Java Project with the same directory name.
Include Servlet Jar file
eclipse IDE - Project Name Right Click - Build Path - Configure Build Path - Tab Libraries - Add External JARs -Browse /usr/local/apache-tomcat-8.5.7/lib/servlet-api.jar
Deploy to aliyun
eclipse IDE - add external jar file mysql-connector-java-8.0.28.jar - Browser localhost:8080/Wrestaurant/ - Error “No suitable driver found for jdbc” - since I am using tomcat and mysql, I should put mysql-connector-java in $CATALINA_HOME/lib. Actually, the connection pool needs to be set up before application is instantiated, so we need to put jar in tomcat server lib folder.
copy *.jar (jstl-1.2.jar, mysql-connector-java-8.0.28.jar, Jason-java.jar) to /usr/local/tomcat/lib
create sql DB Wrestaurant, user “username”, and password to be the same as local machine.
Servlets
First servlet - HelloWorld(NOT a static page)
- eclipse IDE - under Package “com.prog4buss.servlets” - New Class “HelloWorldServlet” - Superclass Browse “HttpServlet” - finish
public class HelloWorldServlet extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
//service, doGet, doPost
PrintWriter out = response.getWriter();
response.setContentType("text/html");
out.println("<html><body><h1>Hello World</h1>");
out.println("<p>The time is : " + new Date() + "</p>");
out.println("</body></html>");
out.close();
}
}
- edit webapps/WEB-INF/web.xml
<servlet>
<servlet-name>HelloWorldServlet</servlet-name>
<servlet-class>com.prog4buss.servlets.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/hello.html</url-pattern>
</servlet-mapping>
- build WAR file Wrestaurant.war - copy to /usr/local/tomcat/webapps - chown user.user /usr/local/tomcat -R - Browser http://localhost:8080/hello.html
Notice:If chown only Wrestaurant, maybe encounter 404 error, because tomcat/work is owned by root.
Possible errors
-
404: web.xml url-pattern path name wrong; Notice When copy war file to /usr/local/tomcat and chown only Wrestaurant then 404, but if edit web.xml that is OK, because read web.xml will OK but accessing /usr/local/tomcat/work will not OK.
-
Nasty looking errors, including message"Address already in use" : another server is already using port 8080
-
500: class structure error including message “class HellowWorldServlet is not a servlet”, eg: class HelloWorldServlet without “extends HttpServlet”
Show Homepage - ViewMenuServlet
- with the help of pakages com.prog4buss.data (MenuDataService.java) and com.prog4buss.domain (MenuCategory.java,MenuItem.java, Order.java)
MenuDataService menuDataService = new MenuDataService();
List<MenuItem> menuItems = menuDataService.getFullMenu();
for (MenuItem menuItem : menuItems) {
out.println("<li>" + menuItem + "</li>");
}
- and the same configuration with web.xml
<servlet>
<servlet-name>ViewMenuServlet</servlet-name>
<servlet-class>com.prog4buss.servlets.ViewMenuServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ViewMenuServlet</servlet-name>
<url-pattern></url-pattern> //blank to display default page
</servlet-mapping>
- build WAR file Wrestaurant.war - copy to /usr/local/tomcat/webapps - chown -R user.user /usr/local/tomcat - Browser http://localhost:8080/ to show Homepage
Handling Forms - MenuSearchServlet
- use search.html by Matt
<form action="/searchResults.html" method="GET">
Find dishes containing : <input type="text" name="searchTerm" id="searchTerm" /> <input type="submit" value="search" />
</form>
- construct MenuSearchServlet alike (copy ViewMenuServlet), extract “searchTerm” from request, find the menuItems is DB, and outprintln to response.
String searchTerm = request.getParameter("searchTerm"); //get search string from request
List<MenuItem> menuItems = menuDataService.find("searchTerm");
for (MenuItem menuItem : menuItems) {
out.println("<li>" + menuItem + " " + menuItem.getDescription() + "</li>");
}
-
build WAR - copy - chown - Browser http://localhost:8080/Wrestaurant/search.html - input search “veg” - submit - searchResults.html?searchTerm=veg, OK
-
Errors
- If Error 404, then check the directory permission of /usr/local/tomcat
- If getParameter(“searchTerm”) mispelled, eg. “searchTTerm”, then got Error 500 including “null pointer exception”.
-
If search “xxx”, the result display is not friendly, so put some friendly message like this:
if (menuItems.size() > 0) {
...
}
else {
out.println("I'm sorry, there are no dishes containing " + searchTerm);
}
GET, POST and Redirect
Get and Post
- Get and Post are NOT relevant directly to Web Application, but it is important to all web sites.
- The GET method should be used for non-destructive operations — that is, operations where you are only “getting” data from the server, not changing data on the server. For example, a query to a search service might be a GET request. GET requests may be cached by the browser, which can lead to unpredictable behavior if you are not expecting it. GET requests generally send all of their data in a query string.
- The POST method should be used for destructive operations — that is, operations where you are changing data on the server. For example, a user saving a blog post should be a POST request. POST requests are generally not cached by the browser; a query string can be part of the URL, but the data tends to be sent separately as post data.
- SearchResultsServlet { public void service (HttpServletRequest request, …) }
- Get: , http://…/serchResults.html?searchTerm=veg
- Post:,http://…/serchResults.html
-
if change method service to doGet, then only meth