SCWCD (web组件开发认证)
SCWCD(Sun certified web component developer)
1.1servlet
Java服务器小程序,运行于服务器端,是一个中间层,负责接收客户端请求,然后做出响应。
Browser ßà Server [servlet …..] ßà Database
【我的思考】
为什么要采用BS模式?试想一下,如果要对数据库操作并包含一定业务逻辑大体上有几种方式?
l ApplicationßàDatabase
这种方式application 中包含业务逻辑和对数据库的连接、控制、关闭,如果业务逻辑、数据库发生了变化,就需要修改程序后分发给每一个用户,这是非常不可取的。可以说这是单机版或者很小的使用人群可以使用这种方式。
l ClientßàServerßàDatabase
这种方式将业务逻辑和数据库层面的操作都提取出来放到服务器上,由server接收客户端请求并响应,客户端只负责处理本地的业务逻辑,这种方式虽然在一定程度上减少了对客户端更新的情况,但是这种情况依然存在。
l BrowserßàServerßàDatabase
客户端为轻量的,虽然对操作受到一定限制,但是便于服务器端的更行和维护,对客户来说是透明的。
BrowserßàServer[ ßàweb server(处理底层网络)ßàapp server(处理业务逻辑)]ßàDB
Servlet 的几个重要特性:
线程,不同于cgi使用进程的方式,Servlet会为每一个请求打开一个线程,减少cpu占用
缓存,不用于cgi针对每一个请求会将cgi程序代码载入内存一次,Servlet只载入单一副本
Tomcat的安装与配置(略)
Tomcat启动分析
Tomcat启动àcatalina_home(需要预先设置这个环境变量,就是tomcat的安装目录)
Tomcat在5之后的版本以catalina作为servlet的容器。
Tomcat的目录结构及用途:
目录 | 功能描述 |
/bin | 存放启动和关闭tomcat的脚本 |
/common/lib | 存放可以被tomcat和所有web应用程序访问的jar |
/conf | 存放各种配置文件,主要包括:server.xml(tomcat主配置文件),tomcat-users.xml,web.xml等 |
/logs | 存放tomcat日志文件 |
/server/lib | 存放只能被tomcat服务器访问的jar |
/server/webapps | 存放tomcat的两个应用程序,admin应用程序和manager应用程序 |
/work | Tomcat将jsp生成的servlet源文件和字节码文件存放在这个目录下 |
Tomcat体系结构
先看下图:
l Server:整个catalina容器
l Service:server包含多个service,每个service将多个连接器绑定到这个service的engine
l Connector:负责连接客户端,接收客户请求,返回响应结果。
l Engine:每个service包含一个引擎,从Connector接收用户请求,处理用户请求。再通过空闲的Connector返回给客户端。
l Host:一个engine可包含多个虚拟主机
l Context:代表web应用程序(一个web应用程序是由一组Servlet、html、类以及其他资源组成的运行在web服务器上的完整应用程序),每个context都有唯一的路径。
一个servlet示例
Servlet开发分四步:编码、编译、部署、运行
1. 编码
Package chapter01
Import java.io.*;
Import javax.servlet.*;
Import javax.servlet.http.*;
Public class helloWorldServlet extends HttpServlet{
Public void service(HttpServletRequest request,HttpServletResponse response)
Throws ServletException,IOException{
printWriter pw=response.getWriter();
pw.println(“<html>”);
pw.println(“<head>”);
pw.println(“</head>”);
pw.println(“<body>”);
pw.println(“helloWorld”);
pw.println(“</body>”);
pw.println(“</html>”);
}
}
上例中引入了javax.servlet和javax.servlet.http包位于servlet-api.jar在common/lib目录下。
2. 编译
既可以使用集成开发环境,也可以使用javac命令
3. 部署
部署一个web应用程序分两个步骤:
l 将web资源放置到指定目录中。
以本例为例:
包:Package chapter01 类:helloWorldServlet
就是将这个文件拷贝至%tomcat_home%/webapps/chapter01/Web-INF/classes目录中
l 编辑web.xml文件配置应用程序,将其放置在web应用程序的Web-INF目录中
本例为:
将编辑好的web.xml文件拷贝至%tomcat_home%/webapps/chapter01/Web-INF/
示例的xml:
<?xml version=”1.0” encoding=”ISO-8859-1”?>
<web-app xmlns=http://java.sun.com/xml/ns/j2ee
Xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
Xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
version=”2.4”>
<display-name>root</display-name>
<servlet>
<servlet-name>helloworldservlet</servlet-name>
<servlet-class>chapter01.helloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloworldservlet</servlet-name>
<url-pattern>/helloworldservlet</url-pattern>
</servlet-mapping>
</web-app>
4. 运行
启动tomcat,打开浏览器,http://localhost:8080/helloworldservlet
Servlet应用开发接口被分成两个包:javax.servlet和javax.servlet.http。对这两个包中api的掌握决定了servlet开发的成败。
每一个servlet类必须直接或间接的实现javax.servlet. Servlet接口,接口的方法如下:
方法 | 功能描述 |
init() | Servlet容器会在servlet实例化后,在放置于服务service()之前精确的调用init()方法,这个方法必须成功执行并退出。 |
service() | Servlet容器调用这个方法允许Servlet响应请求,在init之前不响应。 |
destroy() | Servlet容器调用这个方法将servlet实例从service中删除,只有在service所有线程退出或发生超时错误后方可执行。 |
getServletConfig() | 返回servletConfig对象 |
getServiceInfo() | 向servlet运行者提供有关信息 |
Service方法用于处理客户端请求并创建服务器端响应,当客户端发来请求时,Servlet容器自动调用这个方法。
Service(ServletRequest req,ServletResponse res)
Req:代表客户端请求
Res:代表服务器响应
Servlet
|-----------GenericServlet 可继承该类并重载service()完成自己的servlet的功能
|------javax.servlet.http.HttpServlet service方法允许servlet响应一个请求
|-----------ServletRequest 这个类中的方法用于从客户端请求中提取信息。
|------java.servlet.http.HttpServletRequest 获取http请求头信息、cookie等
|-----------ServletResponse 这个类中的方法用于发送适当的信息给客户端。
|------java.servlet.http.HttpServletResponse 设置响应的头信息、cookie等
Servlet优点使用java语言,移植性好
缺点:支持的协议受web服务器限制,至少支持http。必须按照框架规范。
2.1 jsp
动态网页的执行过程:
Jsp -------------------------------------------------------------------à web server
|
|
转换成等价的servletß ---- 处理其中的程序片段
|
|
以转换后的servlet和标记替换原片段
|
|
ß---以html格式返回客户端ß---与html部分融合
所有操作都在服务器端执行,传送给客户端的仅是运行结果。
Jsp由html和java代码构成。
Jsp是servlet引申出来的,具有良好的页面展现,编码简易等特点。
Web应用程序由两种技术构成:
l Servlet:负责处理业务逻辑,如用户校验、访问数据库等
l Jsp:负责处理表示层,如输入信息表单页面、提示信息等
Jsp架构模式有两种:
l Jsp+JavaBean:jsp负责处理所有事物,jsp页面独自响应客户端所有请求并将处理结果返回客户端。Jsp接收客户端请求创建javabean访问数据库,处理后将结果返回客户端。这种模式导致页面嵌入大量的脚本语言,难以维护;而且jsp中的代码无法复用,使应用程序组件可复用率达到最低,因此这种模式只适合作为业务逻辑简单且不经常修改的web应用开发使用。
Jsp+Servlet+JavaBean:遵循mvc(模型-视图-控制器)设计模式。Jsp负责表现页面,servlet完成大量事务处理。在这中模式中,servlet负责处理所有请求的事务,充当控制者的角色
l 接收客户端发送的请求
l 创建jsp需要的javabean对象
l 根据用户请求决定将哪个jsp发给用户
Jsp技术是scwcd考试的主要内容,构成元素和语法必须要掌握:
类别 | 元素 | 功能描述 |
伪指令 | <%@page %> | 指定整体jsp页面属性 |
<%@include %> | 通知jsp容器在当前jsp页面中内嵌指定位置上的资源内容 | |
<%@taglib %> | 导入jsp页面开发者的自定义标签 | |
声明 | <%! 声明%> | 声明、定义方法和变量 |
脚本 | <% 代码%> | java语句集合 |
表达式 | <%=表达式%> | 在页面输出值的简洁方式 |
动作指令 | <jsp:include /> | 在当前jsp页面中包含静态或动态资源,请求时间内允许。 |
<jsp:forword /> | 允许将客户端请求转发到另一个资源文件 | |
<jsp:useBean /> | 在jsp中创建一个javabean实例 | |
<jsp:setProperty /> | 设置javaBean使用的参数值 | |
<jsp:getProperty /> | 获取javaBean使用的参数值 | |
<jsp:plugin /> | 允许在jsp页面中插入指定的控件 | |
注释 | <%-- 注释 --%> | 注释 |
3.1 web应用程序
什么是web应用程序?
就是通过互联网访问的应用程序,基于B/S架构的应用系统。网站是典型的例子,不过网站只是web应用程序的一种。
B/S比C/S有很多优势:
l 维护升级简单
l 成本低,先期一次投入,后期维护费用较少
l 服务器承担符合,对客户端要求很低
l 数据集中在服务器,安全性高
l 数据库系统对数据统一管理,数据一致性好,实时性好
l 服务器保留有操作日志,数据库有日志可对数据溯源
Web资源分为:静态资源(html、图片、flash等)、动态资源(servlet等)
http传输过程分四步:
1. 客户端打开一个与服务器的连接
2. 客户端发送一个http请求到服务器端
3. 客户端接收由服务器端返回的响应
4. 关闭与服务器端的连接
为什么说http协议是无状态的?
因为服务器端一旦返回响应给客户端本次连接就结束了,也就是说客户端的每一次请求都是全新的、独立的,不依赖于之前的任何一个连接,数据不会从一个请求延续到下一个请求。
浏览器:http客户端 web服务器:http服务器端
Html网页、图像文件、servlet等是web资源,每个资源由统一的资源标识符(URI)标识。
辨析URI、URL、URN
l URI:统一资源标识符,用于标识web资源的字符串,是URL的一部分,没有域名和查询字符串,例如:files/sales/report.html
l URL:是一个指定传输协议的字符串
n <protocol>://<server-name>[:port]/<url-path>[?query-string]
n Protocol:传输协议,不同协议有各自的格式和响应的解析方式。
n Server-name:服务器名,就是web服务器使用的域名
n Port:端口号,代表一个特定的服务
n url-path:路径,指定访问资源的路径
n query-string:查询字符串,位于问号后面,表示在http请求中发送的数据
l URN:统一资源名称。是资源的唯一标识,例如:ISBN:1-930110-59-6
http请求和http响应统称http消息,二者格式十分相近。
名称 | 描述 |
初始行 | 指定请求或响应消息的目的 |
标题 | 指定大小、类型、编码格式等额外的辅助信息,有助于处理该消息 |
空行 |
|
正文 | 请求或响应消息的主体 |
******************http请求****************************
由三部分组成,各部分之间由空格分开。
方法名 URI HTTP协议版本
例如: GET /reports/sales/index.html HTTP/1.1
| | |
方法名 URI 请求的HTTP协议的版本号
方法名:用于指定客户端请求服务器端希望执行的操作。http请求有8个,分别是:
GET、HEAD、POST、PUT、OPTIONS、DELETE、TRACE、CONNECT。
l Get方法:用于检索资源,一般是静态资源,如html、图像等。也可用于检索动态资源,适用于不包含或包含少量参数的http请求,如果请求包含参数,则参数会以查询字符串形式追加到URI尾部,如:
GET /servlet/helloServlet?userid=songyc&userpwd=111 http/1.1
多个查询字符串之间用&分隔。
在HTTP请求中增加查询字符串可以不用通过表单发送数据,避免了检索数据的步骤。缺点是URL最多可接受240个字符,且不保密。
l HEAD方法:用于检查请求的资源最新的修改时间。
l POST方法:用于发送数据到服务器端,html网页使用post方法提交表单数据
初始行 POST /servlet/helloServlet http/1.1
头信息 User-Agent:MOZILLA/1/1
Content-Type:application/x-www-form-urlencoded ß请求的数据类型
ContentLength:11 ß请求的数据长度
空白行
正文 userid=john ß请求的数据
很明显,post方法将参数放在正文中,而get方法将参数放在uri中。
l PUT方法:用于向服务器端添加资源,即发布文件到服务器端。例如:可以使用
http://www.myhome.com/files/example.html将一个客户端本地文件example.html放置在服务器端。
Post方法是发送数据到服务器端处理,Put方法是发送数据到服务器端指定的URI处。
HTTP响应:是服务器端向客户端发消息。一个响应包含三部分:
HTTP协议版本
状态码
描述
例如:
http/1.1 404 not found
http/1.1 500 internal errorß描述,就是描述状态码的短语
|
状态码是请求的结果
触发http请求的三种途径:
1. 点击网页超链接
2. 点击表单的提交按钮
3. 地址栏直接输入
只有浏览器默认使用get方法在网页表单中才不需要指定method属性,除此之外必须指定。
<form name=’loginform’ method=’post’ action=’/loginServlet’>
<input type=’text’ name=’userid’>
<input type=’password’ name=’passwd’>
</form>
Get和post方法比较:
特性 | Get方法 | Post方法 |
可被请求的对象 | 动态、静态web资源。适合获取html和图像等,只需发送文件名给服务器即可 | 动态web资源 |
传输数据类型 | 文本 | 文本、二进制文件 |
传输数据量 | 请求240个字符以内 | 请求自身没有限制 |
数据保密性 | 不保密 | 保密 |
数据缓存 | 数据可在浏览器的url历史中保存下来 | 数据不能在浏览器的url历史中保存 |
******************处理http请求************************************
在了解了http协议方法如何发送http请求及各自适用的场景后,继续学习http协议如何与servlet通信。
http请求àweb服务器-----------------à将http方法映射到Servlet中对应的方法
|
解析
|
Servlet容器调用HttpServlet的service(ServletRequest,ServletResponse)方法
|
上面的方法继而调用service(HttpServletRequest,HttpServletResponse)
|
调用doXXX()方法
http协议方法 | httpServlet方法 |
Get | doGet() |
Head | doHead() |
Put | doPut() |
Post | doPost() |
Delete | doDelete() |
Options | doOptions() |
trace | doTrace() |
少了一个connect的对应?不知道是否书作者的疏漏
上述所有httpServlet方法均为空,需要程序员重载,自行编辑业务逻辑和处理。
这里需要注意的是:service()方法如果重载之后不会自动映射doXXX()方法,所以不要重载它,只要重载doPost()和doGet()方法,底层的调用交给Servlet容器处理。
所有doXXX()方法都具有两个参数:HttpServletRequest和HttpServletResponse
有Servlet容器负责实现这两个接口的类实例对象。
HttpServletRequest接口是最常用的,继承自ServletRequest专门针对web应用程序,http协议。
先看一下ServletRequest: 主要用途是从客户端请求中提取数据,常用的检索数据的方法如下:
方法 | 功能描述 |
String getParameter(String paramName) | 获取指定参数的值 |
String[] getParameterValues(String paramName) | 获取指定参数的所有值,如一个参数有多个值的情况,典型的是复选 |
Enumeration getParameterNames() | 获取所有参数的名字。用于不知道参数名要获取参数值的情况,然后通过循环遍历结合getParameter和getParameterValues获取参数值。 |
|

Servlet容器的方法
方法 | 功能描述 |
Void init(ServletConfig) | Servlet容器调用此方法初始化Servlet |
Void service(ServletRequest,ServletResponse) | Servlet容器调用此方法 |
Void destroy() |
|
Web.xml
<?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>
<!------------------过滤器定义---------------------------->
<filter>
<filter-name>TradeAssistantAutoLoginFilter</filter-name> <filter-class>net.emedchina.tradeassistantclient.filter.TradeAssistantAutoLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TradeAssistantAutoLoginFilter</filter-name>
<servlet-name>Portal</servlet-name>
</filter-mapping>
<!------------------servlet定义---------------------------->
<servlet>
<servlet-name>Portal</servlet-name>
<servlet-class>net.emedchina.base.Portal</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Portal</servlet-name>
<url-pattern>/portal</url-pattern>
</servlet-mapping>
<!------------------标签库定义---------------------------->
<taglib>
<taglib-uri>emed-html</taglib-uri>
<taglib-location>/WEB-INF/emed-html.tld</taglib-location>
</taglib>
<!------------------资源定义---------------------------->
<resource-ref>
<res-ref-name>jdbc/gpo_ds</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>CONTAINER</res-auth>
</resource-ref>
<!------------------会话超时定义---------------------------->
<session-config>
<session-timeout>1440</session-timeout>
</session-config>
<!------------------监听器定义---------------------------->
<listener> <listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
</listener>
<mime-mapping>
<extension>wsdl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xsd</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<!------------------上下文定义---------------------------->
<context-param>
<param-name>appId</param-name>
<param-value>jundui</param-value>
</context-param>
</web-app>
先来看
<filter>
<filter-name>TradeAssistantAutoLoginFilter</filter-name> <filter-class>net.emedchina.tradeassistantclient.filter.TradeAssistantAutoLoginFilter</filter-class>
</filter>
net.emedchina.tradeassistantclient.filter.TradeAssistantAutoLoginFilter.java
引入部分:
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import net.emedchina.tradeassistantclient.util.UserHelper;
import net.emedchina.user.db.GpoUsrUser;
import javax.servlet.http.*;
import java.io.*;
import org.apache.log4j.Logger;
类体
public class TradeAssistantAutoLoginFilter implements Filter{
private static Logger log = Logger.getLogger(TradeAssistantAutoLoginFilter.class);
private static final String USER_LOGIN ="user.login";
private static final String OPERATE = "Login";
public void init(FilterConfig arg0) throws ServletException {}
public void destroy() {}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpSession session = request.getSession(true);
//若为交易助手客户端用户且还未登录web则自动登录
String TAclient = (String)request.getParameter("TAClient");
if( TAclient!=null&&TAclient.equals("1")&&(session == null || (GpoUsrUser)session.getAttribute("USER_SESSION")==null) ) {
String code = (String)request.getParameter("code");
String passWord = (String)request.getParameter("passWord");
java.sql.Connection con_con=null;
try{
con_con = net.emedchina.common.db.ConnectionManager.getConnection();
if (con_con==null) throw new ServletException("fail to get db connection!");
GpoUsrUser currentUser=UserHelper.doAutoLogin(con_con,code,passWord);
if (currentUser==null) throw new ServletException("Your password error or you don't have the right to access this module!");
currentUser.checkPermission(null);
session.setAttribute("USER_SESSION",currentUser);
}catch(Exception e){
throw new ServletException(e.getMessage());
}finally{
try {
if(con_con != null) {
con_con.close();
con_con=null;
}
}catch(Exception e1){};
}
}
//如果是客户端用户则处理输出
if( TAclient!=null&&TAclient.equals("1")){
resp.setContentType("text/html; charset=GBK");
TSClientResponseWrapper rw=new TSClientResponseWrapper((HttpServletResponse)resp);
chain.doFilter(request,rw);
rw.getOutputStream().flush();
}else{
chain.doFilter(request, resp);
}
}
}
再来看
<servlet>
<servlet-name>Portal</servlet-name>
<servlet-class>net.emedchina.base.Portal</servlet-class>
</servlet>
在emedFramework中net.emedchina.base.Portal.java
引入部分
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import net.emedchina.tradeassistantclient.util.UserHelper;
import net.emedchina.user.db.GpoUsrUser;
import javax.servlet.http.*;
import java.io.*;
import org.apache.log4j.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
类体
private static final long serialVersionUID = -3256171887584782623L;
private static Logger log = Logger.getLogger(Portal.class);
//在开发时将其设为false,url后直接加菜单的字符串方便调试。
public static boolean isLogin = true;
/**
* 重载doGet doPost
* 调用doServlet
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws javax.servlet.ServletException, java.io.IOException {
doServlet(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws javax.servlet.ServletException, java.io.IOException {
doServlet(request, response);
}
/**
* !本函数设置env! * 权限检查 * 用户认证
*/
private void doServlet(HttpServletRequest request,
HttpServletResponse response)
throws javax.servlet.ServletException, java.io.IOException {
Environment env = null;
if (request instanceof EmedHttpRequestWrap){
//得看一下这个东东EmedHttpRequestWrap
env = ((EmedHttpRequestWrap)request).getEnv();//返回env对象
}else{
env = new Environment(request, response);
}try{
performTask(env);//
//提交
env.commitConnection();
}catch (EmedException e){
try{
env.rollbackConnection();
}catch (SQLException ee) {}
request.setAttribute("ServletException", e);
setNextPage(env, "/common/error/error.jsp");
log.error(e.getMessage());
}catch (Throwable e){ //系统捕获不到的错误
try{
env.rollbackConnection();
}catch (SQLException ee){}
request.setAttribute("ServletException", e);
setNextPage(env, "/common/error/error.jsp");
}finally{//关闭数据库连结
try{
env.closeConnection();
}catch (Exception e){}
}
//转向
request.setAttribute("output", env.getOutput());
request.setAttribute("ourNextPage",env.getNextPage());
toNextPage(request, response, env.getNextPage());
}
public void performTask(Environment env) throws Throwable {
String operate = env.getInput().operate;
//这是什么东东 BusinessHandlerConfig???
String businessName = BusinessHandlerConfig.getValue(env.getInput().handlerId +
"");
if ((businessName == null) || (businessName.length() == 0)) {
throw new BaseException("没有配置Servlet ID值为" +
env.getInput().handlerId +
"请检查ServletConfig文件");
}
if (operate == null){
throw new BaseException("operate没有定义");
}
//清session
if ("1".equals(env.getInput().getIsMenuFlag())) {
env.removeMenuSession();
env.getInput().setIsMenuFlag("0");
}
if (isLogin &&
(!(env.getInput().handlerId.equals(SysConfig.getLoginHandler()) &&
env.getInput().operate.equals(SysConfig.getLoginOperate()))) &&
(!(env.getInput().handlerId.equals(SysConfig.getLoginHandler()) &&
env.getInput().operate.equals(SysConfig.getLogoutOperate()))) &&
(!(env.getInput().handlerId.equals("key.login") &&
env.getInput().operate.equals(SysConfig.getLoginOperate()))) &&
(!(env.getInput().handlerId.equals("key.login") &&
env.getInput().operate.equals(SysConfig.getLogoutOperate()))) &&
(!(env.getInput().handlerId.equals("key.login") &&
env.getInput().operate.equals("Interact"))) &&
(!(env.getInput().handlerId.equals("key.login") &&
env.getInput().operate.equals("InteractStep1")))){
if (env.getCurrentUser() == null) {
env.setNextPage("/index.jsp");
return;
}
}
if(StringUtils.isNotEmpty(env.getInput().getCurrModuleID())){
env.setSession("navigation_str" , getNavigation(env.getInput().getCurrModuleID() , env.getCon()));
}
Class[] paraType = {Environment.class};
Class businessClass = null;
try{
businessClass = Class.forName(businessName);
}catch (Exception e){
throw new BaseException(businessName + "类没有找到," +
"请检查ServletConfig文件");
}
try{
java.lang.reflect.Method method = businessClass.getMethod("do" +operate, paraType);
Object[] para = {env};
method.invoke(businessClass.newInstance(), para);
}catch (NoSuchMethodException e){
throw new BaseException(businessClass.getName() + "没有定义" + "do" +
operate + "(Environment env)方法");
}catch (IllegalAccessException e){
throw new BaseException(e);
}catch (java.lang.reflect.InvocationTargetException e){
throw e.getTargetException();
}
}
/**
* 设置转向页
*/
protected void setNextPage(Environment env, java.lang.String newNextPage) {
env.setNextPage(newNextPage);
}
private void toNextPage(HttpServletRequest request,
HttpServletResponse response, String nextPage)
throws java.io.IOException, javax.servlet.ServletException{
if (nextPage == null){
throw new EmedRuntimeException("下页面为空");
}
while ((nextPage.charAt(0) == '/') && (nextPage.length() > 1)){
nextPage = nextPage.substring(1);
}
getServletConfig().getServletContext()
.getRequestDispatcher('/' + nextPage).forward(request, response);
}
private static String getNavigation (String moduleId , Connection connection){
PreparedStatement st = null;
ResultSet rs = null;
String navigation = null;
try {
st = connection.prepareStatement ("select ((select name from gpo_usr_module a where a.id = b.father_id) || ' >> ' || b.name ) navigation from gpo_usr_module b where id = ? ");
st.setString(1, moduleId);
rs = st.executeQuery ();
if (rs.next ()){
navigation = rs.getString("navigation");
}
} catch(SQLException sqle){
}finally {
if (rs != null){
try {
rs.close ();
} catch (SQLException e) {}
}
if (st != null){
try {
st.close ();
} catch (SQLException e) {}
}
return navigation;
}
}
}