tomcat發布目錄設置
編輯tomcat/conf/server.xml
在<Host>和</Host>間添加如下:<Context path="/myapp" docBase="d:/myapp" debug="0" reloadable="true"></Context>
啟動tomcat后即可訪問:http://localhost:8080/myapp
web應用目錄結構
d:/myapp/*.jsp
d:/myapp/WEB-INF/web.xml
d:/myapp/WEB-INF/classes/ 保存*.class文件
d:/myapp/WEB-INF/lib/ 保存*.jar文件
jsp基礎知識
原理:jsp由系統編譯成servlet,servlet負責相應用戶請求。
注釋:<%--注釋--%>
聲明:<%!聲明變量和函數%>
輸出表達式:<%=輸出表達式%>
連接數據庫jsp實例:test.jsp
<%@ page import="java.sql.*"%> <%@ page language="java" contentType="text/html; charset=utf-8"%> <!DOCTYPE html> <html> <head> <title>連接數據庫腳本測試</title> </head> <body> <table bgcolor="yellow" border="1" width="300px"> <% Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select * from user"); while (rs.next()) { %> <tr> <td><%=rs.getString(1)%></td> <td><%=rs.getString(2)%></td> <td><%=rs.getString(3)%></td> </tr> <% } %> </table> </body> </html>
編譯指令:page、include、taglib <%@ 編譯指令名 屬性名="屬性值"... %>
動作指令:jsp:forward/jsp:param/jsp:include/jsp:plugin/jsp:useBean/jsp:setProperty/jsp:getProperty
package com.zzz.lcy; public class Person { String name; int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } }
默認構造函數不能少,編譯javac Person -d d:/myapp/WEB-INF/classes/
<%@page language="java" contentType="text/html; charset=utf-8"%> <!DOCTYPE html> <html> <head> <title>BeanTest</title> </head> <body> <jsp:useBean id="beanTest1" class="com.zzz.lcy.Person" scope="page"></jsp:useBean> <jsp:setProperty property="name" name="beanTest1" value="lcy" /> <jsp:setProperty property="age" name="beanTest1" value="34" /> <jsp:getProperty property="name" name="beanTest1" /> <jsp:getProperty property="age" name="beanTest1" /> </body> </html>
內置對象:application/config/exception/out/pageContext/request/response/session
參考:http://www.cnblogs.com/jbelial/archive/2012/03/20/2396585.html
servlet配置
編輯d:/myapp/WEB-INF/web.xml
在<webapp></webapp>間添加如下:
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>zzz.lcy.servlet.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/servlet/HelloWorldDemo</url-pattern>
</servlet-mapping>
注意:<servlet-name>必須對應上
訪問網址:http://localhost:8080/myapp/servlet/HelloWorldDemo
package zzz.lcy.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) { response.setContentType("text/html;charset=utf-8"); try { PrintWriter out = response.getWriter(); out.println("hello, world."); out.close(); } catch (IOException e) { e.printStackTrace(); } } public void doPost(HttpServletRequest request, HttpServletResponse response) { doGet(request, response); } }
jsp論壇實例(部分代碼)
javabean

public class User { private int id; private String name; private String password; private String nickname; public User() { } public User(String name, String password, String nickname) { this.name = name; this.password = password; this.nickname = nickname; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } }
數據庫連接

import java.sql.*; public class DB { private Connection conn; private static final String DRIVER = "com.mysql.jdbc.Driver"; private static final String URL = "jdbc:mysql://localhost:3306/bbs"; private static final String USR = "root"; private static final String PASSWD = "123456"; private static DB db = new DB(); private DB() { try { Class.forName(DRIVER); conn = DriverManager.getConnection(URL, USR, PASSWD); } catch (Exception e) { e.printStackTrace(); } } public static DB getInstance() { return db; } public Connection getConn() throws Exception { return conn; } public ResultSet execSql(String sql, Object...objs) throws Exception { PreparedStatement pstmt = conn.prepareStatement(sql); for (int i = 0; i < objs.length; i++) { pstmt.setObject(i + 1, objs[i]); } pstmt.execute(); return pstmt.getResultSet(); } public void close() throws Exception { conn.close(); } public static void main(String[] args) throws Exception { DB db = new DB(); db.execSql("insert into t_user(name,password,nickname) values(?,?,?)", "aaa", "123", "hellokity"); } }
dao

public class UserDAO { public void add(User user) { try { DB.getInstance().execSql("insert into t_user(name,password,nickname) values(?,?,?)", user.getName(), user.getPassword(), user.getNickname()); } catch (Exception e) { e.printStackTrace(); } } public User getByName(String name) { try { ResultSet rs = DB.getInstance().execSql("select * from t_user where name=?", name); User user = new User(); while (rs.next()) { user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setPassword(rs.getString("password")); user.setNickname(rs.getString("nickname")); return user; } } catch (Exception e) { e.printStackTrace(); } return null; } public User getById(int id) { try { ResultSet rs = DB.getInstance().execSql("select * from t_user where id=?", id); User user = new User(); while (rs.next()) { user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setPassword(rs.getString("password")); user.setNickname(rs.getString("nickname")); return user; } } catch (Exception e) { e.printStackTrace(); } return null; } public static void main(String[] args) { UserDAO dao = new UserDAO(); User user = dao.getByName("aaa"); if (user != null) { System.out.println(user.getNickname()); } } }
servlet

public class Login extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse res) {
try {
req.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
res.setContentType("UTF-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
UserDAO user_dao = new UserDAO();
User user = user_dao.getByName(username);
if (user == null) {
req.setAttribute("info", "登錄失敗");
req.setAttribute("page", "../login.html");
} else {
if (password.equals(user.getPassword())) {
req.setAttribute("info", "登錄成功");
HttpSession session = req.getSession(true);
session.setAttribute("username", username);
session.setAttribute("usr_id", user.getId());
try {
res.sendRedirect("../jsp/main.jsp");
} catch (IOException e) {
e.printStackTrace();
}
} else {
req.setAttribute("info", "密碼錯誤");
req.setAttribute("page", "../login.html");
}
}
RequestDispatcher rd = req.getRequestDispatcher("/jsp/result.jsp");
try {
rd.forward(req, res);
} catch (Exception e) {
e.printStackTrace();
}
}
public void doGet(HttpServletRequest req, HttpServletResponse res) {
doPost(req, res);
}
}
main.jsp

<%@ page language="java" pageEncoding="UTF-8" %> <%@page import="zzz.lcy.bbs.dao.ArticleDAO"%> <%@page import="zzz.lcy.bbs.bean.Article"%> <%@page import="java.util.*" %> <% String username = (String)session.getAttribute("username"); if (username == null || username.equals("")) { response.sendRedirect("../login.html"); } ArticleDAO atc_dao = new ArticleDAO(); List<Article> atcList = atc_dao.getAll(); %> <!DOCTYPE html> <html> <body> <%=session.getAttribute("username") %> <table> <tr><th>標題</th><th>發布者</th><th>時間</th></tr> <% for (int i = 0; i < atcList.size(); i++) { Article atc = atcList.get(i); %> <tr> <td><a href="content.jsp?id=<%=atc.getId() %>"><%=atc.getTitle() %></a></td> <td><%=atc.getUsr_id() %></td> <td><%=atc.getDate() %></td> </tr> <% } %> </table> <a href="../publish.html">發文章</a> </body> </html>
result.jsp

<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> <form name="result_form" action="${requestScope.page}" method="post"> ${requestScope.info} <input type="submit" value="確定"> </form> </body> </html>
login.html

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>用戶登錄</title> </head> <body> <form action="servlet/Login" method="post"> 用戶名<input type="text" name="username" /> <br> 密碼<input type="password" name="password" /> <br> <input type="submit" value="登錄" /> <br> <a href="regist.html">注冊</a> </form> </body> </html>
jsp+servlet+javabean實現mvc

import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ControlServlet extends HttpServlet { public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String pathName = req.getServletPath(); System.out.println("pathName= " + pathName); int i = pathName.indexOf("."); String actionName = pathName.substring(1, i); System.out.println("actionName= " + actionName); String actionClassName = this.getInitParameter(actionName); Action action = ActionFactory.getActionFactory().getAction(actionClassName); String url = action.execute(req, res); if (url == null) { req.getRequestDispatcher("error.jsp").forward(req, res); } else { req.getRequestDispatcher(url).forward(req, res); } } }

public interface Action { String execute(HttpServletRequest req, HttpServletResponse res); }

public class LoginAction implements Action { public String execute(HttpServletRequest req, HttpServletResponse res) { String username = req.getParameter("username"); String password = req.getParameter("password"); if (username.equals("aaa") && password.equals("123")) { req.setAttribute("username", username); return "main.jsp"; } return "login.jsp"; } }

public class ActionFactory { private static ActionFactory af = new ActionFactory(); private ActionFactory() {} public static ActionFactory getActionFactory() { return af; } public Action getAction(String actionClassName) { Action action = null; try { action = (Action) Class.forName(actionClassName).newInstance(); } catch (Exception e) { e.printStackTrace(); } return action; } }
應用啟動時啟動servlet

import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Date; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.swing.Timer; public class TimerServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void init(ServletConfig config) { try { super.init(config); } catch (ServletException e) { e.printStackTrace(); } Timer t = new Timer(1000, new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println(new Date()); } }); t.start(); } }
<servlet>
<servlet-name>timer</servlet-name>
<servlet-class>xx.yy.TimerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
訪問servlet的配置參數

import java.sql.Connection; import java.sql.DriverManager; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class DbTestServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void init(ServletConfig config) { try { super.init(config); } catch (ServletException e) { e.printStackTrace(); } } public void service(HttpServletRequest req, HttpServletResponse res) { ServletConfig config = this.getServletConfig(); String driver = config.getInitParameter("driver"); String url = config.getInitParameter("url"); String user = config.getInitParameter("user"); String pass = config.getInitParameter("pass"); try { Class.forName(driver); Connection conn = DriverManager.getConnection(url, user, pass); } catch (Exception e) { e.printStackTrace(); } } }

<servlet> <servlet-name>dbtest</servlet-name> <servlet-class>zzz.lcy.servlet.DbTestServlet</servlet-class> <init-param> <param-name>driver</param-name> <param-value>com.mysql.jdbc.Driver</param-value> </init-param> <init-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/test1</param-value> </init-param> <init-param> <param-name>user</param-name> <param-value>root</param-value> </init-param> <init-param> <param-name>pass</param-name> <param-value>123456</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dbtest</servlet-name> <url-pattern>/dbtest</url-pattern> </servlet-mapping>
過濾器Filter

import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; public class FilterTest implements Filter { private FilterConfig config; public void destroy() { config = null; } public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { ServletContext context = this.config.getServletContext(); long before = System.currentTimeMillis(); System.out.println("開始過濾"); HttpServletRequest req = (HttpServletRequest) arg0; context.log("已經獲得請求地址: " + req.getServletPath()); arg2.doFilter(arg0, arg1); long after = System.currentTimeMillis(); context.log("過濾結束"); context.log("請求被定位到: " + req.getRequestURI() + ", 花費時間: " + (after - before)); } public void init(FilterConfig arg0) throws ServletException { config = arg0; } }
<filter>
<filter-name>log</filter-name>
<filter-class>xx.yy.FilterTest</filter-class>
</filter>
<filter-mapping>
<filter-name>log</filter-name>
<servlet-name>*</servlet-name>
</filter-mapping>
監聽器Listener
Listener的作用類似於load-on-startup,用於在web應用啟動時,啟動某些后台程序,這些后台程序負責為系統運行提供支持。使用Listener需要兩步:
1) 創建Listener實現類。需要實現ServletContextListener接口;
2) 在web.xml中配置Listener。<listener><listener-class>xx.yy.TestListener</listener-class></listener>