为什么能用这些的

81被浏览6327分享邀请回答1297 条评论分享收藏感谢收起解密港珠澳大桥主体工程:为什么会用这种史无前例的方案?
扫一扫 手机阅读
  央视网消息:全长55公里港珠澳大桥的建设中,桥&岛&隧集群的主体工程长约29.6公里,包括22.9公里的桥梁、6.7公里的海底隧道以及连接隧道和桥梁的东、西人工岛。主体工程为什么不选择全部桥梁或者全部隧道,而采用史无前例的桥-岛-隧联合的方案呢?
  港珠澳大桥线路要跨伶仃洋海域,如果全部建桥,不但费用低,而且有已经建成的多座跨海大桥的成熟的技术,这是首先考虑的方案。但大桥靠近香港方向有一个重要的深水航道& 伶仃洋航道,它是大型运输船只在这片海域通行的唯一通道。这里是全球最重要的贸易航道,每天有4000多艘船只穿行,目前达到10万吨级通航等级,远期30万吨油轮可以通行。而要满足30万吨巨轮的通行,桥梁就必须是单跨1500米以上的多跨形式,这就决定了桥梁要建几个超过170米高度的桥塔。
  港珠澳大桥管理局总工程师 苏权科:由于香港飞机的起降线,我们建不了高塔。建不了高塔呢,通航净空要很高的话桥面就没法架过去,根本不具备建桥塔和大框架桥梁的条件。
  航空限高对港珠澳大桥全桥方案一票否决。就在即将陷入僵局的时候,一个史无前例的方案被提出并得到肯定:综合考虑通航需求和航空限高,港珠澳大桥采取6.7公里长的海底隧道和22.9公里长的跨海大桥的联合方案。
  港珠澳大桥管理局总工程师 苏权科:这样的话,我们中间必须要修一段隧道。因为两个主航道刚好在中间,因此我们的隧道也建中间了,两边是桥梁,中间是隧道,这样的话,必须要有两个人工岛来做隧道和桥梁的转换。
  全隧道方案也曾被考虑,考虑到施工和运营风险、工程造价和运营成本等各方面因素,结合国际上的经验教训,全部采用海底隧道的形式也被否决,港珠澳大桥主体工程最终采用了桥&岛&隧集群的方案。
编辑:戴萌萌
责任编辑:王敬东
扫一扫,用手机继续阅读!
央视新闻客户端
央视新闻移动看!
下载到桌面,观看更方便!
24小时点击排行问一个很基础的问题,为什么这样可以实现直接访问接口的方法? - ITeye问答
我是用ssh做的,当然,这部分只涉及到spring,而且我觉得可能跟spring 的关系也不大吗,不多说,上代码和图
(我的问题是:为什么UserAction里面可以直接指向UserService这个接口的方法呢?)
User user = userService.getStuNumberAndPassword(model.getStuNumber(), model.getPassword());)
这是结构图:
UserAction:
package com.hxw.oa.view.
import com.hxw.oa.base.BaseA
import com.hxw.oa.domain.U
import com.opensymphony.xwork2.ActionC
public class UserAction extends BaseAction&User&{
/** 登录 */
public String login() throws Exception {
User user = userService.getStuNumberAndPassword(model.getStuNumber(), model.getPassword());
if (user == null) {
addFieldError("login", "用户或密码不正确");
return "loginUI";
// 正确就登录用户
ActionContext.getContext().getSession().put("user", user);
return "toIndex";
UserServiceImpl:
package com.hxw.oa.service.
import mons.codec.digest.DigestU
import com.hxw.oa.base.BaseDaoI
import com.hxw.oa.domain.U
import com.hxw.oa.service.UserS
public class UserServiceImpl extends BaseDaoImpl&User& implements UserService{
public User getStuNumberAndPassword(String stuNumber, String password) {
return (User) getSession().createQuery(//
"FROM User u WHERE u.stuNumber=? AND u.password=?")//
.setParameter(0, stuNumber)//
.setParameter(1, DigestUtils.md5Hex(password))// 要使用MD5的摘要
.uniqueResult();
UserService接口:
package com.hxw.oa.
import com.hxw.oa.base.BaseD
import com.hxw.oa.domain.U
public interface UserService extends BaseDao&User&{
User getStuNumberAndPassword(String stuNumber, String password);
BaseAction:
package com.hxw.oa.
import java.lang.reflect.ParameterizedT
import javax.annotation.R
import com.hxw.oa.domain.U
import com.hxw.oa.service.UserS
import com.opensymphony.xwork2.ActionC
import com.opensymphony.xwork2.ActionS
import com.opensymphony.xwork2.ModelD
public abstract class BaseAction&T& extends ActionSupport implements ModelDriven&T& {
// @Resource
// protected RoleService roleS
// @Resource
// protected DepartmentService departmentS
protected UserService userS
// @Resource
// protected PrivilegeService privilegeS
// @Resource
// protected ForumService forumS
// @Resource
// protected TopicService topicS
// @Resource
// protected ReplyService replyS
protected T
public BaseAction() {
// 得到model的类型信息
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
Class clazz = (Class) pt.getActualTypeArguments()[0];
// 通过反射生成model的实例
model = (T) clazz.newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
public T getModel() {
* 获取当前登录的用户
protected User getCurrentUser() {
return (User) ActionContext.getContext().getSession().get("user");
// 页码默认为第1页
protected int pageNum = 1;
public int getPageNum() {
return pageN
public void setPageNum(int pageNum) {
this.pageNum = pageN
package com.hxw.oa.
import java.util.L
import com.hxw.oa.domain.PageB
public interface BaseDao&T& {
* 保存实体
* @param entity
void save(T entity);
* 删除实体
* @param id
void delete(Long id);
* 更新实体
* @param entity
void update(T entity);
* 查询实体,如果id为null,则返回null,并不会抛异常。
* @param id
T getById(Long id);
* 查询实体
* @param ids
List&T& getByIds(Long[] ids);
* 查询所有
List&T& findAll();
* 公共的查询分页信息的主法
* @param pageNum
* @param queryListHQL
查询数据列表的HQL语句,如果在前面加上“select count(*) ”就变成了查询总数量的HQL语句了
* @param parameters
参数列表,顺序与HQL中的'?'的顺序一一对应。
PageBean getPageBean(int pageNum, String queryListHQL, Object[] parameters);
BaseDaoImpl:
package com.hxw.oa.
import java.lang.reflect.ParameterizedT
import java.util.C
import java.util.L
import javax.annotation.R
import org.hibernate.Q
import org.hibernate.S
import org.hibernate.SessionF
import org.springframework.transaction.annotation.T
import com.hxw.oa.cfg.C
// @Transactional注解可以被继承,即对子类也有效
@Transactional
@SuppressWarnings("unchecked")
public abstract class BaseDaoImpl&T& implements BaseDao&T& {
private SessionFactory sessionF
protected Class&T& // 这是一个问题!
public BaseDaoImpl() {
// 通过反射得到T的真实类型
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
this.clazz = (Class) pt.getActualTypeArguments()[0];
System.out.println("clazz = " + clazz.getName());
public void save(T entity) {
getSession().save(entity);
public void update(T entity) {
getSession().update(entity);
public void delete(Long id) {
Object obj = getSession().get(clazz, id);
getSession().delete(obj);
public T getById(Long id) {
if (id == null) {
return (T) getSession().get(clazz, id);
public List&T& getByIds(Long[] ids) {
if (ids == null || ids.length == 0) {
return Collections.EMPTY_LIST;
return getSession().createQuery(//
"FROM " + clazz.getSimpleName() + " WHERE id IN(:ids)")//
.setParameterList("ids", ids)//
public List&T& findAll() {
return getSession().createQuery(//
"FROM " + clazz.getSimpleName())//
// 公共的查询分页信息的方法
public com.hxw.oa.domain.PageBean getPageBean(int pageNum, String queryListHQL, Object[] parameters) {
System.out.println("--------------& BaseDaoImpl.getPageBean()");
int pageSize = Configuration.getPageSize();
// 查询本页的数据列表
Query listQuery = getSession().createQuery(queryListHQL);
if (parameters != null && parameters.length & 0) { // 设置参数
for (int i = 0; i & parameters. i++) {
listQuery.setParameter(i , parameters[i]);
listQuery.setFirstResult((pageNum - 1) * pageSize);
listQuery.setMaxResults(pageSize);
List list = listQuery.list(); // 执行查询
// 查询总记录数
Query countQuery = getSession().createQuery("SELECT COUNT(*) " + queryListHQL);
if (parameters != null && parameters.length & 0) { // 设置参数
for (int i = 0; i & parameters. i++) {
countQuery.setParameter(i, parameters[i]);
Long count = (Long) countQuery.uniqueResult(); // 执行查询
return new com.hxw.oa.domain.PageBean(pageNum, pageSize, list, count.intValue());
* 获取当前可用的Session
protected Session getSession() {
return sessionFactory.getCurrentSession();
我以前也有这个疑问,后来看了java基础中继承就明白了很多
赶紧扔了webwork 换spring mvc吧
1. 因为userSerive在BaseAction中有定义,所以userAction就继承了这个属性
2. userService有个@Resource,默认会byName查找id为userService的类,实例化后注入给userService,这是就可以直接调用userService中的方法了
3. applicationContext这个配置文件中是不是应该有id = userService的声明,或者直接在userServiceImpl方法上加上@Service("userService")
没看见你的BaseAction里面已经有属性userservice了吗。。
inject一个接口类型时,spring会在容器里先按id/name查找实现类,找不到再按类型查找来注入,找不到再报错...
你是继承了BaseAction,里面就已经有userService
多看看Spring吧,这是Spring的IoC功能,Spring容器初始化的时候已经接口全部实例化了
已解决问题
未解决问题

我要回帖

 

随机推荐