Java Web学习笔记(一)
JSP声明语句以<%!作为开始,以%>作为结束,使用声明语句声明的变量为全局变量,也就是说如果有多个用户在执行此JSP页面时,将共享该变量。
JSP Scriptlets以<%作为开始,以%>作为结束,其中包含有效的符合java语法规则的java代码,在JSP Scriptlets中可以包含多个变量,语法。
JSP 表达式通过<%=开始,以%>结束,JSP表达式中的代码会首先执行,然后转换成字符串并显示到网页上。
JSP注释分为两类,一类为可以在客户端显示的注释,即HTML注释;一类是不能在客户端显示的注释,即JSP注释。HTML注释使用<!--开始,以-->结束,JSP注释使用<%--开始,以--%>结束。
JSP指令元素:
page指令:主要用来设定JSP页面的全局属性,该配置将作用于整个JSP页面,甚至包括静态包含的文件。语法:
<%@ page 属性1 =“属性值1”属性2 =“属性值2”%>
language属性,主要用来声明所使用的脚本语言种类,目前只能使用java语言。<%@page language=“java”%>
extends属性,用来指定该JSP页面生成的Servlet是集成于哪个父类,设定是必须指定该类的全名,即报名加类名。一般很少使用。
import属性,指定导入的java包,不过有些包在JSP编译时就已经导入了,可以不再导入。默认的导入包如下:
java.lang.*; javax.servlet.*; javax.servlet.jsp.*; javax.servlet.http.*;如<%@page import="java.util.*"%>
session属性,指定该JSP页面中是否可以使用session对象。默认为true。<%@page session="true|false"%>
buffer属性,指定输出流是否具有缓冲区,以及设置缓冲区大小。none表示不具有缓冲功能,设置具体数据,表示缓冲区大小。
autoFlash属性,指定缓冲区是否自动进行强制输出。
isThreadSafe属性,指定该JSP文件是否支持多线程使用,默认为true。
info属性,用来设置该JSP文件的相关信息,可以是任何的信息字符串,并通过Servlet.getServletInfo方法来获取该信息。
errPage属性,用来设置如果当前JSP文件发生异常错误时,网页重新跳转到能够处理异常的JSP文件。<%@ page errPage="错误跳转的页面"%>
isErrorPage属性,用来指定该JSP文件是否为能够处理异常的JSP文件,默认为false。
contentType属性,用来指定该JSP文件MIME格式,以及网页编码格式。<%@ page contentType="text/html";charset="ISO-8859-1"%>
pageEncoding属性,用来指定网页的编码格式。
isELIgnored属性,指定该JSP文件是否支持EL表达式。
include指令
使用include指令包含文件,将会被包含的文件所执行的结果插入到JSP文件放置include指令的位置,只有当被包含的文件执行完成,该JSP文件才会恢复执行。<%@ include file="content.html"%>
taglib指令
用来声明此JSP文件使用了自定义的标签,同事引用所指定的标签库以及设置标签库的前缀。<%@ taglib uri="URIToTagLibrary" prefix = "tagPrefix"%>,其中uri属性用来指定标签库的存放位置,prefix属性用来指定该标签库使用的前缀。例如:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 使用: <c:out value="Hello"></c:out>
JSP动作元素可以用来动态的包含文件、网页跳转以及使用JavaBean组件等等。<jsp:XXX>
第一类是于存取JavaBean有关的,包括三个动作元素:<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>
第二类是JSP基本动作元素,包括六个动作元素:<jsp:include>如果是静态文件,则单纯的加到JSP页面中不进行任何处理,如果包含动态文件,name先进行处理,然后将处理的结果加到JSP页面中。<jsp:include page="包含文件URL地址" flush="true|false">
<jsp:forward>用来转移用户的请求,使得用户的请求的页面从一个页面跳转到另一个页面。这种跳转为服务器段跳转,所以用户的地址栏不会发生任何的变化。<jsp: forward page="跳转文件URL地址">
<jsp:param>用来传递参数,一般与<jsp:include><jsp:forward>联合使用。例如:<jsp:include page="contentDemo.jsp"> <jsp:param name="age" value="19"></jsp:include>。contentDemo.jsp中:<% String strAge = request.getParameter("age")%>
<jsp:plugin><jsp:params><jsp:fallback>
第三类是JSP2.0新增的动作元素,主要与JSP document有关:<jsp:root><jsp:declaration><jsp:scriptlet><jsp:expression><jsp:text><jsp:output>
第四类,主要用来动态的生成XML元素标签的值:<jsp:attribute><jsp:body><jsp:element>
第五类,主要用来Tag File中:<jsp:invoke><jsp:doBody>
JSP内置对象,包括request、response、out、session等等。分类:1、与Servlet有关,page和config。2、与Input/Output有关,out、request和response。3、与Context有关,session、application和pageContext对象。4、与Error有关,exception。
简单的登陆成功失败例子:Login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<html>
<head>
<title>My JSP </title>
</head>
<body>
<center>
<form action="LoginConfig.jsp" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密 码</td>
<td><input type="password" name="userpassword"/></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="登录"/>
<input type="reset" value="重置"/>
</td>
</tr>
</table>
</form>
</center>
</body>
</html>
LoginConfig.jsp
<%@ page language="java" pageEncoding="ISO-8859-1"%>
<html>
<head>
<title>My JSP 'LoginConfig.jsp'</title>
</head>
<body>
<center>
<%
String username = request.getParameter("username");
String userpassword = request.getParameter("userpassword");
%>
<%
if("James".equals(username)&&"1234".equals(userpassword))
{
%>
<jsp:forward page="LoginSuccess.jsp" />
<%
}
else{
%>
<jsp:forward page="LoginFailure.jsp" />
<%} %>
</center>
</body>
</html>
<form action="SetPropertyDemo.jsp" method="post">
<table>
<tr>
<td colspan="2">用户表单</td>
</tr>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="password" name="userpassword"/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交"/><input type="reset" value="重置">
</td>
</tr>
</table>
</form>
SetPropertyDemo.jsp中
<body>
<jsp:useBean id="user" scope="application" class="com.javaweb.ch07.UserBean"></jsp:useBean>
<jsp:setProperty property="*" name="user"/>
<%
out.println("用户名:"+user.getUsername()+"<br>");
out.println("用户密码:"+user.getUserpassword());
%>
</body>
com.javaweb.ch07包中UserBean.java
public class UserBean {
private String username;
private String userpassword;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserpassword() {
return userpassword;
}
public void setUserpassword(String userpassword) {
this.userpassword = userpassword;
}
}
<sql:setDataSource url="jdbc:mysql://localhost:3306/datainfo"
var="ds"
driver="com.mysql.jdbc.Driver"
user="root"
password="root"
/>
<sql:query var="comicinfo" dataSource="${ds}" sql="SELECT * FROM first" />
<table>
<c:forEach items="${comicinfo.rows}" var="row">
<c:forEach items="${row}" var="column">
<tr>
<td align="right">${column.key}</td>
<td align="left">${column.value}</td>
</tr>
</c:forEach>
</c:forEach>
</table>
第一个servlet中:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the GET method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
在web.xml中配置:
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>com.javaweb.ch07.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/servlet/FirstServlet</url-pattern>
</servlet-mapping>
DatabaseConnection数据库连接类:
package com.javaweb.ch08;
import java.sql.DriverManager;
import com.mysql.jdbc.Connection;
//主要功能就是连接数据库、关闭数据库
public class DatabaseConnection {
//定义数据库驱动类
private final String DBDRIVER = "com.mysql.jdbc.Driver";
//定义数据库连接URL
private final String DBURL = "jdbc:mysql://localhost:3306/javaweb";//最后的javaweb是数据库名
//定义数据库连接用户名
private final String DBUSER = "root";
//定义数据库连接密码
private final String DBPASSWORD = "root";
//定义数据库连接对象
private Connection conn = null;
//构造方法,加载驱动
public DatabaseConnection(){
try {
Class.forName(DBDRIVER);
this.conn = (Connection) DriverManager.getConnection(DBURL, DBUSER,DBPASSWORD);
} catch (Exception e) {
e.printStackTrace();
}
}
//取得数据库连接
public Connection getConnection(){
return conn;
}
//关闭数据库连接
public void close(){
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
VO类,是一个包含属性和表中字段完全对应的类。并在该类中提供setter和getter方法来设置并获得该类中的属性。
package com.javaweb.ch08;
public class User {
//用户id
private int userid;
//用户姓名
private String username;
//用户密码
private String password;
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
DAO接口,DAO接口中定义了所有的用户的操作,如添加记录、删除记录以及查询记录等。不过因为是接口,所以仅仅是定义,需要子类来实现。
package com.javaweb.ch08;
import java.util.List;
//定义数据库操作方法
public interface UserDAO {
//增加操作
public void insert(User user) throws Exception;
//修改操作
public void update(User user) throws Exception;
//删除操作
public void delete(User user) throws Exception;
//按ID查询操作
public User queryById(int userid) throws Exception;
//查询全部
public List queryAll() throws Exception;
}
UserDAOImpl:
package com.javaweb.ch08;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class UserDAOImpl implements UserDAO {
//删除操作
public void delete(User user) throws Exception {
String sql = "DELETE FROM user WHERE userid=?" ;
PreparedStatement pstmt = null ;
DatabaseConnection dbc = null ;
// 下面是针对数据库的具体操作
try{
// 连接数据库
dbc = new DatabaseConnection() ;
pstmt = dbc.getConnection().prepareStatement(sql) ;
pstmt.setInt(1,user.getUserid()) ;
// 进行数据库更新操作
pstmt.executeUpdate() ;
pstmt.close() ;
}catch (Exception e){
throw new Exception("操作出现异常") ;
}
finally{
// 关闭数据库连接
dbc.close() ;
}
}
//增加操作
public void insert(User user) throws Exception {
String sql = "INSERT INTO user(username, password) VALUES(?, ?)";
PreparedStatement pstmt = null;
DatabaseConnection dbc = null;
//下面是针对数据库的具体操作
try {
//连接数据库
dbc = new DatabaseConnection();
pstmt = dbc.getConnection().prepareStatement(sql);
pstmt.setString(1, user.getUsername());
pstmt.setString(2, user.getPassword());
//运行数据库更新操作
pstmt.executeUpdate();
pstmt.close();
} catch (Exception e) {
throw new Exception("添加操作出现异常");
} finally{
dbc.close();
}
}
//查询全部
public List<User> queryAll() throws Exception {
List<User> all = new ArrayList<User>();
String sql = "SELECT * FROM user ";
PreparedStatement pstmt = null;
DatabaseConnection dbc = null;
//下面是针对数据库的具体操作
try {
//连接数据库
dbc = new DatabaseConnection();
pstmt = dbc.getConnection().prepareStatement(sql);
//进行数据库查询操作
ResultSet rs = pstmt.executeQuery();
while(rs.next())
{
//查询出内容,之后将查询出的内容赋值给user对象
User user = new User();
user.setUserid(rs.getInt(1));
user.setUsername(rs.getString(2));
user.setPassword(rs.getString(3));
//将查询出来的数据加入到List对象中
all.add(user);
}
rs.close();
pstmt.close();
} catch (Exception e) {
throw new Exception("操作出现异常");
} finally{
dbc.close();
}
return all;
}
//按ID查询操作
public User queryById(int userid) throws Exception {
User user = null;
String sql = "SELECT * FROM user WHERE userid = ?";
PreparedStatement pstmt = null;
DatabaseConnection dbc = null;
//下面是针对数据库的具体操作
try {
//连接数据库
dbc = new DatabaseConnection();
pstmt = dbc.getConnection().prepareStatement(sql);
pstmt.setInt(1, userid);
//运行数据库查询操作
ResultSet rs = pstmt.executeQuery();
if(rs.next())
{
//查询出内容,之后将查询出的内容赋值给user对象
user = new User();
user.setUserid(rs.getInt(1));
user.setUsername(rs.getString(2));
user.setPassword(rs.getString(3));
}
rs.close();
pstmt.close();
} catch (Exception e) {
throw new Exception("按ID查询操作异常");
} finally{
dbc.close();
}
return user;
}
//修改操作
public void update(User user) throws Exception {
String sql = "UPDATE user SET username = ?, password = ? WHERE userid = ?";
PreparedStatement pstmt = null;
DatabaseConnection dbc = null;
//下面是针对数据库的具体操作
try {
//连接数据库
dbc = new DatabaseConnection();
pstmt = dbc.getConnection().prepareStatement(sql);
pstmt.setString(1, user.getUsername());
pstmt.setString(2, user.getPassword());
pstmt.setInt(3, user.getUserid());
//运行数据库更新操作
pstmt.executeUpdate();
pstmt.close();
} catch (Exception e) {
throw new Exception("更新操作出现异常");
} finally{
dbc.close();
}
}
}
DAO工厂类:
package com.javaweb.ch08;
public class DAOFactory {
public static UserDAO getUserDAOInstance(){
return new UserDAOImpl();
}
}
AddUserDemo.jsp举例:
<%@ page language="java" import="com.javaweb.ch08.*" pageEncoding="gb2312"%>
<html>
<head>
<title>添加用户操作</title>
</head>
<body>
<%
//通过DAO工厂获得DAO实现类实例
UserDAO userDAO = DAOFactory.getUserDAOInstance();
UserDAO userDAO1 = new UserDAOImpl();
//设置需要添加的用户
User user = new User();
user.setUsername("dao");
user.setPassword("123");
userDAO.insert(user);
%>
</body>
</html>
<form action="LoginConfig" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="password" name="password"/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交"/><input type="reset" value="重置">
</td>
</tr>
</table>
</form>
package com.javaweb.ch08;
public class LoginCheck {
//判断是否为合法用户
public boolean isLogin(String username,String password)
{
if("James".equals(username) && "1234".equals(password))
{
return true;
}else{
return false;
}
}
}
package com.javaweb.ch08;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginConfig extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//接受用户参数
String username = request.getParameter("uname");
String password = request.getParameter("upassword");
//获得session对象
HttpSession session = request.getSession();
//new一个LoginCheck对象
LoginCheck lc = new LoginCheck();
//调用业务逻辑组件的判断功能来判断
if(lc.isLogin(username,password)){
//如果为合法用户,在request范围中添加属性login,其属性值为true,并跳转到登录成功页
session.setAttribute("login", "true");
request.getRequestDispatcher("Login_success.jsp").forward(request, response);
}else{
//如果非法用户跳转到登陆失败页
request.getRequestDispatcher("Login_failure.jsp").forward(request, response);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<%@page contentType="text/html;charset=gb2312"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>用户登录</title>
</head>
<body>
<center>
<h2>用户登录</h2>
<%--登录表单,提交到login.action--%>
<s:form action="login">
<%-- 用户名输入框 --%>
<s:textfield name="uname" label="用户名"></s:textfield>
<%-- 密码输入框 --%>
<s:password name="upassword" label="密码"></s:password >
<%-- 登陆按钮 --%>
<s:submit value="登陆"></s:submit>
<%-- 重置按钮 --%>
<s:reset value="重置"></s:reset>
</s:form>
</center>
</body>
</html>
<%@page contentType="text/html;charset=gb2312"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title><s:text name="login.title"></s:text></title>
</head>
<body>
<center>
<s:text name="login.title"></s:text>
<%--登录表单--%>
<s:form action="login">
<s:textfield name="uname" key="login.username"></s:textfield>
<s:password name="upassword" key="login.password"></s:password>
<s:submit value="登录"></s:submit>
<s:reset value="重置"></s:reset>
</s:form>
</center>
</body>
package com.javaweb.ch15;
public class LoginCheck {
//判断是否为合法用户
public boolean isLogin(String name,String password){
if("James".equals(name)&&"123456".equals(password)){
return true;
}else{
return false;
}
}
}
package com.javaweb.ch15.action;
import com.javaweb.ch15.LoginCheck;
public class LoginAction2 implements Action{
private String uname;
private String upassword;
//获得uname值
public String getUname() {
return uname;
}
//设置uname值
public void setUname(String uname) {
this.uname = uname;
}
//获得password值
public String getUpassword() {
return upassword;
}
//设置password值
public void setUpassword(String upassword) {
this.upassword = upassword;
}
public String execute() throws Exception {
//new一个LoginCheck对象
LoginCheck lc = new LoginCheck();
//调用业务逻辑组件的判断功能来判断
if(lc.isLogin(getUname(),getUpassword())){
//如果为合法用户,在session范围中添加属性login,其属性值为true,
ActionContext.getContext().getSession().put("login", "true");
return SUCCESS;
}else{
return ERROR;
}
}
}
package com.javaweb.ch15.action;
import com.javaweb.ch15.LoginCheck;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction3 extends ActionSupport {
private String uname;
private String upassword;
//获得uname值
public String getUname() {
return uname;
}
//设置uname值
public void setUname(String uname) {
this.uname = uname;
}
//获得password值
public String getUpassword() {
return upassword;
}
//设置password值
public void setUpassword(String upassword) {
this.upassword = upassword;
}
//执行输入校验
public void validate() {
//如果用户名为null,或者为空的话,那么提示错误信息
if(getUname() == null || "".equals(getUname().trim())){
this.addFieldError("uname", this.getText("username.required"));
}
//如果密码为null,或者为空的话,那么提示错误信息
if(getUpassword() == null || "".equals(getUpassword().trim())){
this.addFieldError("upassword", this.getText("password.required"));
}
}
public String execute() throws Exception {
//new一个LoginCheck对象
LoginCheck lc = new LoginCheck();
//调用业务逻辑组件的判断功能来判断
if(lc.isLogin(getUname(),getUpassword())){
//如果为合法用户,在session范围中添加属性login,其属性值为true,
ActionContext.getContext().getSession().put("login", "true");
return "success";
}else{
return "failure";
}
}
}
login.title = login
login.password = password
login.username = username
password.required = password is requested
username.required = username is requested
login.password = \u5BC6\u7801
login.title = \u767B\u5F55
login.username = \u7528\u6237\u540D
password.required = \u5BC6\u7801\u5FC5\u987B\u8F93\u5165
username.required = \u7528\u6237\u540D\u5FC5\u987B\u8F93\u5165